2017-08-09 162 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