2015-05-02 4 views
2

Я бегу commad (Ubuntu 12.04)Почему инструмент cppcheck не находит неинициализированную переменную?

cppcheck test.cpp 

Я ожидал неинициализированное переменное предупреждение от cppcheck инструмента. Почему инструмент cppcheck не печатает его в командной строке?

Пример кода каст:

#include <iostream> 

class Foo 
{ 
private: 
    int m_nValue; 

public: 
    Foo(); 
    int GetValue() { return m_nValue; } 
}; 

Foo::Foo() 
{ 
    // Oops, we forget to initialize m_nValue 
} 

int main() 
{ 
    Foo cFoo; 
    if (cFoo.GetValue() > 0) 
    {//... 
    } 
    else 
    {//... 
    } 
} 
+1

'm_nValue' фактически _default initialized_ в соответствии с действующим стандартом. Связано: http://stackoverflow.com/questions/9299101/what-c-idioms-are-deprecated-in-c11/9338032#9338032 –

+0

Вы получите лучшие результаты, используя 'clang -analyze'. –

+1

@ πάνταῥεῖ: И что инициализация по умолчанию делает с 'int'? Правильно ... ничего. –

ответ

4

Поскольку этот материал трудно, и cppcheck не Бог Всемогущий Творец Вселенной и познавший все?

Некоторые проблемы на самом деле невозможны для обнаружения в общем случае; Я не уверен, что это один из них. Но если cppcheck рассматривает только одну единицу трансляции за раз тогда, ну, что, если Foo::Foo были определены в какой-либо другой единицы перевода?

2

Статический анализ (это то, что делает cppcheck) не является точной наукой, и не может быть. В теореме Райса говорится: «любое нетривиальное свойство поведения программы неразрешимо» (см. «Понимание вычислений: от простых машин к невозможным программам» Тома Стюарта).

Кроме того, зарегистрируйтесь What is static analysis от Matt Might. В обоих случаях вы должны понять, что не только статический анализ сложный и неразрешимый.

Таким образом, существует ряд причин, по которым ccpcheck не сообщает о потенциальном использовании неинициализированной переменной.

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

Надежда эта помощь, Т.

7

Для получения дополнительной информации .. если вы используете --enable = предупреждение, cppcheck пишет такое сообщение:

[test.cpp: 13]: (предупреждение) переменной-члена 'Foo :: m_nValue' не инициализируется в конструкторе.

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