Bufferoverflow,snprintf 而不是 char 调整大小?

Bufferoverflow, snprintf instead char resizes?

我很难理解为什么下面的代码没有导致缓冲区溢出,而是一些似乎如何将 char 示例的大小从 1 调整为 16。

我查看了 snprintf 文档,但没有找到任何相关信息。

//set char example size 1
char example[1];

//set example to args->arg2 which is a 15 character + 1 null byte.
//trying to put something to big into something too small, in my mind causing not a resize but a bof.

snprintf(example, 16, "%s", args->arg2); 

fprintf(stdout,"[%s],example);

最后的fprintf没有显示1个字符,也没有char示例溢出,而是它似乎调整了大小并显示了16个完整的字符串。

我在这里误解了什么?

您的数组未调整大小。相反,发生的是 一些内存跟随它(实际上它是你的调用堆栈,这就是为什么像这样的超限是危险的),并且 snprintf 'trusts'你并写入那段记忆。 fprintf 之后愉快地阅读 snprintf 在那里写的任何内容。

它现在对你有效,但它是未定义的行为,这意味着它迟早会崩溃。