Компилятор не предупреждает при разыменовании nullptr - PullRequest
2 голосов
/ 06 мая 2011

Это:

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

не заставляет ни gcc 4.6, ни VS2010 sp1 выдавать хотя бы предупреждение.Есть ли возможность в любом из этих компиляторов заставить их выдавать предупреждение в подобных случаях?Я тестирую скомпилированную в VS с /w4.

Ответы [ 7 ]

8 голосов
/ 06 мая 2011

Это не незаконно, это просто неопределенное поведение.

Включение предупреждений для этого может привести к ложному ощущению безопасности, поскольку часто до времени выполнения не известно, если какой-то указатель указывает на nullptr или что-то еще. Valgrind может проверить эти ошибки (и многие другие).

Не говоря уже о том, что это значительно увеличит время компиляции.

5 голосов
/ 06 мая 2011

В Visual Studio 2010 SP1 (не знаю, какая версия вам нужна), запустите Анализ кода. Я только что попробовал с вашим точным кодом, и он показывает предупреждение 6011:

warning C6011: NULL-Zeiger "p" wird dereferenziert.: Lines: 138, 139
4 голосов
/ 06 мая 2011

«Подобные случаи» довольно неясны, и для этого потребуется, чтобы компилятор возвращался от каждой разыменования и проверял, может ли он доказать, что он знает, что указатель имеет константу и недопустим, значение.

Учтите, что какой-то другой части программы можно дать указатель на указатель (псевдоним) и перезаписать его в другом пути кода или (что еще хуже) в другом потоке.

Это нелегко обнаружить, и я думаю, что стоимость времени компиляции для реальных программ сделает его не стоящим, даже если его можно будет реализовать с разумными усилиями.

2 голосов
/ 06 мая 2011

Вальгринд может указать на это.Я использую его для проверки такого рода неясных случаев и недопустимых операций чтения / записи.

1 голос
/ 06 мая 2011

Это неопределенное поведение.Это означает, что компилятору не требуется выдавать предупреждение или ошибку.

1 голос
/ 06 мая 2011

Это ошибка времени выполнения, а не ошибка времени компиляции.Компилятор может отлавливать такие разыменования только в очень ограниченных случаях, когда он может быть полностью уверен в значении указателя.Там просто нет смысла для дополнительной сложности.

0 голосов
/ 06 мая 2011

Разыменование нулевого указателя является неопределенным поведением. Компилятору разрешено диагностировать такие случаи, но это не обязательно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...