2016-10-12 3 views
1

Можно проверить с помощью clang-check, если какой-то поток выполнения может быть недоступен? И из-за этого, например, может произойти нуль-ссылка?clang static analysis - проверить нулевую переменную инициализацию относительно потока выполнения

Например, если 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; 
} 

спасибо.

+2

Статический анализатор не должен иметь никаких проблем с этим. – gnasher729

+0

Я предполагаю, что вы правы, но мне нужно какое-то математическое подтверждение, возможность случая, когда моя переменная будет нулевой, поскольку какой-то поток выполнения никогда не возникает. Так что это похоже, что анализатор clang может обнаружить его, но может пропустить. – user1503944

ответ

1

Доказательство? №

Проблема с Turing's Halting показывает, что вы не можете доказать все свойства программ в целом. По сути, никакая программа («инструмент статического анализа») не может решить, является ли любое предикат (всегда) истинным или (всегда) ложным.

Таким образом, вы не можете построить статический анализатор, чем может правильно сказать вам, что этот код иногда производит нулевой указатель:

p* x=null; 
if (somefunction()) 
    x=&...; 
return x; 

[В примере OP, то как бы он ожидал инструмент, чтобы определить, что Вэл не всегда больше 2?]

Вы можете создать эвристический инструмент, который может тривиально решить, что функция может возвращать true или false. В этом случае он может сообщить, что «x, возможно, null». Плохая новость заключается в том, что ваш анализ теперь, вероятно, сообщает, что для многих и многих вариантов этого кода. Если эти отчеты являются ложными срабатываниями, ваш инструмент будет отвергнут программистами, быстро, как временный сток.

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

Смежные вопросы