/analyze
не гарантирует выдачу соответствующих и правильных предупреждений.
Он может и пропустит множество проблем, а также дает ряд ложных срабатываний (вещи, которые он определяет как предупреждения, но которые совершенно безопасны и никогда не произойдут)
Нереально ожидать нулевого предупреждения с / анализировать.
Он указал на ситуацию, когда вы разыменовываете указатель, который it не может проверить, всегда действителен. Насколько PREfast может сказать, нет никакой гарантии, что он никогда не будет NULL.
Но это не значит, что может быть NULL. Просто анализ, необходимый для доказательства его безопасности, слишком сложен для PREfast.
Возможно, вы сможете использовать специфическое для Microsoft расширение __assume
, чтобы сообщить компилятору, что он не должен выдавать это предупреждение, но лучшим решением будет оставить предупреждение. Каждый раз, когда вы компилируете / анализируете (что необязательно каждый раз, когда вы компилируете), вы должны убедиться, что предупреждения, которые он выдает, все еще являются ложными срабатываниями.
Если вы правильно используете свои утверждения (для обнаружения логической ошибки во время программирования, защиты от ситуаций, которые не могут произойти, то я не вижу проблем с вашим кодом или с выходом предупреждения. Добавление кода для обработки проблема в том, что может никогда не возникать, просто бессмысленна. Вы добавляете больше кода и усложняете без причины (если этого никогда не произойдет, то у вас нет способа восстановить его, потому что вы абсолютно не знаете в каком состоянии находится программа. Все, что вы знаете, это то, что она ввела путь кода, который вы считали невозможным.
Однако, если вы используете свой assert в качестве фактической обработки ошибок (значение может быть NULL в исключительных случаях, вы просто ожидаете, что этого не произойдет), то это дефект в вашем коде. Затем требуется правильная обработка ошибок (как правило, исключений).
Никогда не используйте подтверждения для проблем, которые возможны . Используйте их, чтобы убедиться, что Невозможно не происходит. И когда / анализ дает вам предупреждения, посмотрите на них. Если это ложное срабатывание, игнорируйте его (не подавляйте его, потому что, хотя это ложное срабатывание сегодня, код, который вы проверяете завтра, может превратить его в реальную проблему).