为什么不编译为导致未定义行为的代码发出错误

时间:2010-12-11 17:12:01

标签: c++ compiler-construction

例如,文章通常会说如果malloc和delete配对,或者说它是错误的而且不这样做。

但是为什么编译器不为我们做一些检查。

有没有这种代码是正确和有意的?因此编译器不能总是说这样做是错误的吗?

或者编译器在技术上有困难吗?

4 个答案:

答案 0 :(得分:2)

很多原因。在我的头顶。

  • 某些未定义的行为可能已将效果定义为特定于实现的扩展。

  • 某些未定义的行为仅基于程序的环境或输入而发生,因此代码可能会导致未定义的行为,但不一定会这样做。

  • 许多未定义行为的实例很难诊断。可能涉及可能在后续翻译单元中发生冲突的事情。如果它们易于诊断,那么标准可能需要实施来发布诊断,就像在许多情况下一样。

答案 1 :(得分:1)

那么,你会怎么说呢?

int* p = (int*)malloc(sizeof(p));
foobar(&p);
delete p;

foobar位于不同的编译单元中。你不知道它的作用。

答案 2 :(得分:1)

实际上,在某些情况下,理论上不可能弄清楚malloc是否与删除配对。想象一下halting problem和程序末尾的删除。

答案 3 :(得分:0)

编译器不一定知道指针是使用newmalloc创建的,还是只是指向堆栈上某些东西的指针。但是,像valgrind这样的内存调试器可以找到其中的一些错误。