2

这个:

int* p = nullptr;
auto tmp = *p;  

不会导致 gcc 4.6 和 VS2010 sp1 至少发出警告。在这些编译器中是否有任何选项可以让它们在这种情况下发出警告?我在 VS 中使用 /w4 进行了测试编译。

4

7 回答 7

8

这不是非法的,它只是未定义的行为。

为此打开警告可能会导致错误的安全感,因为通常直到运行时才知道某个指针是否指向nullptr或指向其他东西。Valgrind 可以检查这些错误(以及更多)。

更不用说它会大大增加编译时间。

于 2011-05-06T10:15:00.943 回答
5

在 Visual Studio 2010 SP1(不知道你需要哪个版本)中,运行代码分析。我刚刚尝试使用您的确切代码,它显示警告 6011:

warning C6011: NULL-Zeiger "p" wird dereferenziert.: Lines: 138, 139
于 2011-05-06T10:55:47.570 回答
4

“像这样的情况”非常模糊,它需要编译器从每次取消引用中回溯,看看它是否可以证明它知道指针具有一个常量且无效的值。

考虑到程序的其他部分可以被赋予一个指向指针的指针(别名)并在不同的代码路径中覆盖它,或者(更糟)在不同的线程上。

它不容易被发现,而且我认为现实世界程序的编译时间成本会让它变得不值得,如果它甚至可以通过合理的努力来实现的话。

于 2011-05-06T10:14:06.337 回答
2

valgrind 可以指出这一点。我用它来检查这种晦涩难懂的情况,以及无效的读/写。

于 2011-05-06T10:20:09.063 回答
1

这是运行时错误,而不是编译时错误。编译器只能在非常有限的情况下捕获此类取消引用,因为它可以完全确定指针值。增加复杂性是没有意义的。

于 2011-05-06T10:29:29.437 回答
1

这是一种未定义的行为。这意味着编译器不需要发出警告或错误。

于 2011-05-06T10:32:06.993 回答
0

取消引用空指针是未定义的行为。允许编译器诊断此类情况,但不是必须的。

于 2011-05-06T10:39:06.917 回答