是否有充分的理由使用 Visual C++ 2010 编译此代码而没有警告(并且在运行时崩溃):
int a = *((int*)nullptr);
静态分析应该得出会崩溃的结论吧?
是否有充分的理由使用 Visual C++ 2010 编译此代码而没有警告(并且在运行时崩溃):
int a = *((int*)nullptr);
静态分析应该得出会崩溃的结论吧?
这种使用会
nullptr
产生编译器错误吗?
不。
取消引用空指针会导致未定义的行为,但不需要诊断。
静态分析应该得出会崩溃的结论吧?
它可能。它不必。如果发出警告肯定会很好。专用的静态分析工具(例如 Klocwork)可能会发出警告。
是的,静态分析会显示这总是崩溃。但是,这将需要编译器实际执行此静态分析。大多数编译器不这样做(至少我不知道)。
所以问题是:为什么 C/C++ 编译器不做更多的静态类型检查。
编译器不这样做的原因主要是:传统,以及使编译器尽可能简单的理念。
C(以及较小程度的 C++)是在计算能力相当昂贵的环境中创建的,并且易于编写编译器很重要(因为有许多不同的硬件架构)。
由于静态类型检查分析既会使编译器更难编写,又会使编译速度变慢,因此当时并不认为这是优先事项。因此大多数编译器没有它。
其他语言(例如)Java 会做出不同的权衡,因此在 Java 中,许多在 C 中允许的事情都是非法的(例如,无法访问的代码是 Java 中的编译时错误;在 C 中,大多数编译器甚至不会发出警告)。这真的归结为哲学。
顺便说一句,请注意,如果需要,您可以在 C 中进行静态类型检查 - 有几种可用的工具,例如lint(古代),或查看哪些开源 C++ 静态分析工具可用?.