2017-08-09 58 views
1

我需要一个静态分析器,它可以找到模板类类型的未初始化变量members/variables ...。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

'TemplateTest'甚至没有默认构造函数,所以你的代码不能编译。 – Rakete1111

+0

对不起,修改后的代码进行编译。 – cierech

+1

在什么时间点进行单位化?在构造函数运行之后,在对象发生任何其他事情之前?如果有多个构造函数,并且有一些初始化一个插槽,并且有一些初始化其他插槽,但是所有插槽都被构造函数所覆盖,那么您的定义是否“未初始化”?或者您是否想知道在从特定站点调用构造函数之后插槽是否未初始化? –

回答

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. 
+0

这很有用,谢谢! – cierech

+0

后续问题: 任何想法,为什么不提高未初始化值警告 '模板 ::值> 类可观察 { 市民: 可观测(){} private: T value_; }; class Bah { public: Bah(){}; private: Observable tValue_; };' 但是,当我删除第二个模板参数(布尔),它呢? – cierech

+0

看来你已经找到了一个案例,Cppcheck目前是盲目的。我在我们的bugtracker上创建了一个关于这个测试用例的票(http://trac.cppcheck.net/ticket/8162#ticket)。 非常感谢您评价Cppcheck! – orbitcowboy