检测到C snprintf sprintf堆栈粉碎

时间:2013-10-24 04:57:50

标签: c

我有以下功能,有时会发出“堆栈粉碎检测”。但是当我将sprintf()修改为snprintf(nbytes_buf, sizeof(nbytes_buf), "%d", nbytes)时,问题就解决了。

'data'永远不会超过1024字节。所以,我认为nbytes_buf [20]就足够了。但是当'data'包含字符'>'时,我也会遇到“堆栈粉碎检测”问题。

有谁知道为什么?

int a( const char *data )
{
    int nbytes;
    char nbytes_buf[20];

    nbytes = strlen(data);
    sprintf(nbytes_buf, "%d", nbytes);

    /* do something else */
    return 0;
}

2 个答案:

答案 0 :(得分:0)

如果使用sprintf()缓冲区的大小应足够大,以包含整个结果字符串。 snprintf()将克服此问题,因为如果结果字符串长于 n-1 个字符,则剩余的字符将被丢弃而不会被存储。

因此,只有当您使用"stack smashing detected"并且字符串的大小大于sprintf()时才会收到错误n-1。如果您使用snprintf(),即使字符串的大小大于n-1,也不会出现问题。

答案 1 :(得分:0)

阅读http://pubs.opengroup.org/onlinepubs/000095399/functions/printf.html snprintf()函数应该等效于sprintf(),并添加了n参数,该参数表示s引用的缓冲区的大小。如果n为零,则不应写入任何内容,并且s可能是空指针。否则,将丢弃超出n-1的 *输出字节而不是写入数组, *并且在实际写入数组的字节末尾写入空字节。