C ++静态分析,模板类

时间:2017-08-09 13:34:47

标签: c++ static-analysis cppcheck clang-static-analyzer

我需要一个静态分析器,它会找到模板化类类型的未初始化变量成员/变量。

任何分析仪都可以这样做吗?我试过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 个答案:

答案 0 :(得分: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.