C ++ статический анализ, шаблоны классов

Мне нужен статический анализатор, который найдет неинициализированные переменные-члены / переменные типа шаблонного класса.

Может ли анализатор сделать это? Я попробовал clang / cppcheck и пару других без удачи.

Вот мой тестовый код:

enum class ViewMode
{
One   = 1,
Two     = 2,
Three  = 3,
Four     = 4
};

class TestClass {
public:
TestClass() {}
};

template<typename T, bool C = std::is_copy_constructible<T>::value>
class TemplateTest
{
public:

TemplateTest() {}

TemplateTest(const T& value)
: value_(value)
{}

TemplateTest(const TemplateTest&) = delete;

TemplateTest(TemplateTest<T, C>&& rhs)
: value_(std::move(rhs.value_))
{}

TemplateTest(T&& value)
: value_(std::move(value))
{}
private:
T value_;

};

class StaticAnalysisTest {

public:
StaticAnalysisTest() {}

void DoSomething() {

}

private:
ViewMode viewMode_;     //this uninitialized warning is found
TemplateTest<ViewMode> viewMode2_; //this one is not
};

Я далее разобрал проблему, чтобы:

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

class Bar
{
public:
Bar(){}

void DoSomething() {
Foo foo;
}
};

Это не генерирует предупреждение об унитарной переменной, но когда я закомментирую:

 //Foo(int value) : m_nValue(value) {}

оно делает

1

Решение

Спасибо за оценку Cppcheck. Для второго примера выдается предупреждение, если вы добавляете флаг —inconclusive, например:

class Foo
{
private:
int m_nValue;
public:
Foo() {};
explicit Foo(int value) : m_nValue(value) {}
int GetValue() const
{
return m_nValue;
}
};

class Bar
{
public:
Bar() {}

static void DoSomething() {
Foo foo;
}
};

Выход из Cppcheck

$ cppcheck --enable=all --inconclusive uninitmembervar.cpp
[uninitmembervar.cpp:6]: (warning, inconclusive) Member variable 'Foo::m_nValue' is not initialized in the constructor.
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector