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
在那里写的任何内容。
它现在对你有效,但它是未定义的行为,这意味着它迟早会崩溃。
我很难理解为什么下面的代码没有导致缓冲区溢出,而是一些似乎如何将 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
在那里写的任何内容。
它现在对你有效,但它是未定义的行为,这意味着它迟早会崩溃。