2017-08-09 20 views
1

テンプレート化されたクラス型の初期化されていない変数のメンバー/変数を見つける静的解析器が必要です。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'もデフォルトコンストラクタがありません:警告は、あなたが、たとえば、--inconclusiveフラグを追加する場合には、第二の例のために与えられています、あなたのコードはコンパイルされません。 – Rakete1111

+0

申し訳ありません、コンパイルするコードを修正しました。 – cierech

+1

どの時点でユニット化されましたか?コンストラクタが実行された後、オブジェクトに何か他のことが起こる前に?複数のコンストラクタがあり、あるスロットを初期化し、他のスロットを初期化するものもあれば、すべてのスロットがコンストラクタのセットで覆われているものは、定義によって「初期化されていませんか?または、コンストラクタが特定のサイトから呼び出された後にスロットが初期化されていないかどうかを知りたいですか? –

答えて

1

Cppcheckを評価していただきありがとうございます。 Cppcheck

から

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 --enable=all --inconclusive uninitmembervar.cpp 
[uninitmembervar.cpp:6]: (warning, inconclusive) Member variable 'Foo::m_nValue' is not initialized in the constructor. 
+0

を参照してくださいそれはありがとう!!!! これは初期化されない値の警告に 'テンプレートを上げていない理由を任意のアイデア、<型名T、BOOL C =のstd :: is_copy_constructible :: value>の クラス観察可能 { 公共:: 観測 – cierech

+0

質問をフォローアップ(){} プライベート: T VALUE_。 }; クラスフン {パブリック: フン(){}。プライベート : 観察可能 tValue_。 }; ' しかし、私は2番目のテンプレートパラメータ(ブール値)を削除するとき、それはありませんか? – cierech

+0

Cppcheckが現在見えない場合があります。私は私達のバグトラッカー(http://trac.cppcheck.net/ticket/8162#ticket)にこのテストケースについてのチケットを作成しました。 Cppcheckを評価いただきありがとうございます! – orbitcowboy

関連する問題