程序不会因堆溢出而崩溃

2024-02-11

我写了以下程序:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void main(int argc, char *argv[]){
  char *input;
  input = (char*)malloc(16);
  printf("input is : %s\n", input);
}

当我运行它时:

./test `python -c 'print "A"*5000'`

它不会崩溃。它而是打印数据。

当我使用free(input) after printf,它崩溃了。

为什么会发生这种情况?


显示的代码忽略其命令行参数:

int main(int argc, char *argv[]){
  char *input;
  input = (char*)malloc(16);
  printf("input is : %s\n", input);
}

Python 脚本提供什么并不重要。然而,你的printf()正在打印未初始化的数据;这会导致未定义的行为。如果printf()不会崩溃,并且有一个free(input);之后调用printf(),那么free()不应该崩溃。

如果您错过了复制操作并打算显示类似的内容,则规则会有所不同:

int main(int argc, char *argv[]){
  char *input;
  input = (char*)malloc(16);
  strcpy(input, argv[1]);
  printf("input is : %s\n", input);
  free(input);
  return 0;
}

现在你没有检查argv[1]在使用它之前不是空指针——这可能会导致崩溃。如果你传递 5000 个字符,你就会超出分配的内存范围argv[1]。有些事情可能会引发崩溃;没有定义什么会导致崩溃。这strcpy()可能会失败;这printf()如果副本没有失败,则可能不会失败(但这不能保证);这free()可能会失败,因为你超出了界限(但即使如此也不能保证)。这就是“未定义行为”的奇迹;任何事情都可能发生,这是有效的行为。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

程序不会因堆溢出而崩溃 的相关文章

随机推荐