缓冲区溢出,sprintf而不是char调整大小? [重复]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了缓冲区溢出,sprintf而不是char调整大小? [重复]相关的知识,希望对你有一定的参考价值。

这个问题在这里已有答案:

我很难理解为什么下面的代码没有导致缓冲区溢出,而是有些如何将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'信任'你并写入那个内存。之后,fprintf愉快地阅读snprintf在那里写的任何东西。

它现在适合你,但它是未定义的行为,这意味着它迟早会破裂。

以上是关于缓冲区溢出,sprintf而不是char调整大小? [重复]的主要内容,如果未能解决你的问题,请参考以下文章

sprintf

c套接字发送和接收一个int而不是一个char缓冲区

sprintf系列函数

sprintf函数使用

Arduino sprintf函数的用法详解

sprintf和snprintf函数