С помощью clang-check можно доказать, что какой-то поток выполнения может быть недоступен? И из-за этого, например, может произойти нулевая де-ссылка?
Например, в случае val <= 2 передается в foo, ptr по-прежнему равен nullptr.
struct mystruct { int field; };
mystruct *foo(bool arg1, int val)
{
mystruct ptr = nullptr;
if (!arg1) return ptr;
if (val > 2 )
ptr = new mystruct;ptr->field = val; // <<<< -- here
return ptr;
}
Спасибо.
доказывать? Нет.
Проблема остановки Тьюринга показывает, что вы не можете доказать все свойства программ в целом. По сути, ни одна программа («инструмент статического анализа») не может решить, является ли произвольный предикат (всегда) истинным или (всегда) ложным.
Таким образом, вы не можете построить статический анализатор, который может правильно сказать вам, что этот код иногда выдает нулевой указатель:
p* x=null;
if (somefunction())
x=&...;
return x;
[В примере OP, как он мог ожидать, что инструмент определит, что val не всегда больше 2?]
Вы можете создать эвристический инструмент, который может тривиально решить, что функция может возвращать true или false. В этом случае он может сообщить, что «x, возможно, равен нулю». Плохая новость заключается в том, что ваш анализ теперь, вероятно, сообщает, что для многих, многих вариантов этого кода Если эти отчеты являются ложными срабатываниями, ваш инструмент будет быстро отклонен программистами, поскольку он тратит время.
Что многие инструменты статического анализа делают с оценкой, которая может случиться что-то плохое, как правило, не сообщать обо всем, чтобы избежать потока ложных срабатываний.
Других решений пока нет …