Доказательство? №
Проблема с Turing's Halting показывает, что вы не можете доказать все свойства программ в целом. По сути, никакая программа («инструмент статического анализа») не может решить, является ли любое предикат (всегда) истинным или (всегда) ложным.
Таким образом, вы не можете построить статический анализатор, чем может правильно сказать вам, что этот код иногда производит нулевой указатель:
p* x=null;
if (somefunction())
x=&...;
return x;
[В примере OP, то как бы он ожидал инструмент, чтобы определить, что Вэл не всегда больше 2?]
Вы можете создать эвристический инструмент, который может тривиально решить, что функция может возвращать true или false. В этом случае он может сообщить, что «x, возможно, null». Плохая новость заключается в том, что ваш анализ теперь, вероятно, сообщает, что для многих и многих вариантов этого кода. Если эти отчеты являются ложными срабатываниями, ваш инструмент будет отвергнут программистами, быстро, как временный сток.
Что многие инструменты статического анализа делают с оценкой, что может произойти что-то плохое, как правило, не сообщать обо всех, чтобы избежать потока ложных срабатываний.
Статический анализатор не должен иметь никаких проблем с этим. – gnasher729
Я предполагаю, что вы правы, но мне нужно какое-то математическое подтверждение, возможность случая, когда моя переменная будет нулевой, поскольку какой-то поток выполнения никогда не возникает. Так что это похоже, что анализатор clang может обнаружить его, но может пропустить. – user1503944