我有以下功能,有时会发出“堆栈粉碎检测”。但是当我将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;
}
答案 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的 *输出字节而不是写入数组, *并且在实际写入数组的字节末尾写入空字节。