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

问题描述 投票:-2回答:1

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

我很难理解为什么下面的代码没有导致缓冲区溢出,而是有些如何将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的完整字符串。

我在这里误会了什么?

c printf buffer-overflow
1个回答
1
投票

您的数组未调整大小。相反,发生的事情是它后面有一些内存(事实上它是你的调用堆栈,这就是为什么这样的超出是危险的),而snprintf'信任'你并写入那个内存。之后,fprintf愉快地阅读snprintf在那里写的任何东西。

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

© www.soinside.com 2019 - 2024. All rights reserved.