我需要一個靜態分析器,它可以找到模板類類型的未初始化變量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) {}
它
'TemplateTest'甚至沒有默認構造函數,所以你的代碼不能編譯。 – Rakete1111
對不起,修改後的代碼進行編譯。 – cierech
在什麼時間點進行單位化?在構造函數運行之後,在對象發生任何其他事情之前?如果有多個構造函數,並且有一些初始化一個插槽,並且有一些初始化其他插槽,但是所有插槽都被構造函數所覆蓋,那麼您的定義是否「未初始化」?或者您是否想知道在從特定站點調用構造函數之後插槽是否未初始化? –