缓冲区溢出,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调整大小? [重复]的主要内容,如果未能解决你的问题,请参考以下文章