1

是否有充分的理由使用 Visual C++ 2010 编译此代码而没有警告(并且在运行时崩溃):

int a = *((int*)nullptr);

静态分析应该得出会崩溃的结论吧?

4

2 回答 2

6

这种使用会nullptr产生编译器错误吗?

不。

取消引用空指针会导致未定义的行为,但不需要诊断。

静态分析应该得出会崩溃的结论吧?

它可能。它不必。如果发出警告肯定会很好。专用的静态分析工具(例如 Klocwork)可能会发出警告。

于 2011-01-28T00:49:45.463 回答
3

是的,静态分析会显示这总是崩溃。但是,这将需要编译器实际执行此静态分析。大多数编译器不这样做(至少我不知道)。

所以问题是:为什么 C/C++ 编译器不做更多的静态类型检查。

编译器不这样做的原因主要是:传统,以及使编译器尽可能简单的理念。

C(以及较小程度的 C++)是在计算能力相当昂贵的环境中创建的,并且易于编写编译器很重要(因为有许多不同的硬件架构)。

由于静态类型检查分析既会使编译器更难编写,又会使编译速度变慢,因此当时并不认为这是优先事项。因此大多数编译器没有它。

其他语言(例如)Java 会做出不同的权衡,因此在 Java 中,许多在 C 中允许的事情都是非法的(例如,无法访问的代码是 Java 中的编译时错误;在 C 中,大多数编译器甚至不会发出警告)。这真的归结为哲学。

顺便说一句,请注意,如果需要,您可以在 C 中进行静态类型检查 - 有几种可用的工具,例如lint(古代),或查看哪些开源 C++ 静态分析工具可用?.

于 2011-01-28T01:10:46.413 回答