テンプレート化されたクラス型の初期化されていない変数のメンバー/変数を見つける静的解析器が必要です。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) {}
'TemplateTest'もデフォルトコンストラクタがありません:警告は、あなたが、たとえば、--inconclusiveフラグを追加する場合には、第二の例のために与えられています、あなたのコードはコンパイルされません。 – Rakete1111
申し訳ありません、コンパイルするコードを修正しました。 – cierech
どの時点でユニット化されましたか?コンストラクタが実行された後、オブジェクトに何か他のことが起こる前に?複数のコンストラクタがあり、あるスロットを初期化し、他のスロットを初期化するものもあれば、すべてのスロットがコンストラクタのセットで覆われているものは、定義によって「初期化されていませんか?または、コンストラクタが特定のサイトから呼び出された後にスロットが初期化されていないかどうかを知りたいですか? –