Почему инструмент cppcheck не находит неинициализированные переменные?

Я запускаю запятую (Ubuntu 12.04)

cppcheck test.cpp

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

Пример cpp-кода:

#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
    {//...
    }
}

person user3455638    schedule 02.05.2015    source источник
comment
m_nValue на самом деле инициализируется по умолчанию в соответствии с текущим стандартом. Связанный: stackoverflow .com/questions/9299101/   -  person πάντα ῥεῖ    schedule 02.05.2015
comment
Вы получите лучшие результаты, используя clang --analyze.   -  person Thomas Dickey    schedule 02.05.2015
comment
@πάνταῥεῖ: И что инициализация по умолчанию делает с ints? Правильно... ничего.   -  person Lightness Races in Orbit    schedule 02.05.2015


Ответы (3)


Потому что это сложно, а cppcheck — это не Всемогущий Бог, Создатель Вселенной и Всезнающий?

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

person Lightness Races in Orbit    schedule 02.05.2015

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

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

person Daniel Marjamäki    schedule 09.05.2015

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

Кроме того, ознакомьтесь с Что такое статический анализ Мэтта Майта. В обоих случаях вы должны понять, что статический анализ не только сложен и неразрешим.

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

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

Надеюсь на эту помощь, Т.

person thurizas    schedule 02.05.2015
comment
Не думайте, что здесь применима теорема Райса. Программа даже не имеет ввода! - person jinawee; 16.07.2019
comment
Теорема Райса говорит о нетривиальных семантических свойствах программ (см. en.wikipedia.org/wiki/Rice %27s_theorem), хотя в качестве примера в обсуждении используется остановка для всех входных данных, семантические свойства не ограничиваются входными данными. - person thurizas; 16.07.2019