0

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

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

有谁知道为什么?

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

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

    /* do something else */
    return 0;
}
4

2 回答 2

0

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

因此,"stack smashing detected"仅当您使用sprintf()并且字符串的大小大于n-1. 如果使用snprintf()该问题,即使字符串的大小大于n-1.

于 2013-10-24T05:03:24.927 回答
0

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

于 2013-10-24T05:04:24.910 回答