我很难理解下面的代码为什么没有导致缓冲区溢出,而是有些如何将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。
我在这里误会什么?
答案 0 :(得分:1)
您的数组未调整大小。相反,发生的是 之后有一些内存(实际上这是您的调用堆栈,这就是为什么这样的溢出很危险的原因),并且snprintf
“信任”您并将其写入记忆。之后,fprintf
会愉快地读取在那里写的snprintf
。
它现在对您有效,但是它是未定义的行为,这意味着它迟早会崩溃。