在此代码片段中,Init() 函数充当按需初始化程序,用于填充结构的所有成员变量。这样做是为了避免调用堆栈上大型数组的所有成员的默认构造函数:
struct Foo {
int m_Member;
void Init(int i);
};
void Foo::Init(int i) {
m_Member = i;
// Many other members initialized here.
}
void SomeFunction(int n) {
Foo buffer[64];
assert(n <= 64);
// Explicitly initialize what is needed.
for (int i = 0; i < n; ++i) {
buffer[i].Init(i * 3);
}
// Use buffer[0] - buffer[n-1] somehow.
}
这会在 VS2012 中使用 /analyze 触发静态分析错误:
warning C6001: Using uninitialized memory 'buffer'.: Lines: 17, 19, 20
我正在寻找一种方法来注释 Foo::Init() 以便不会发生此警告。还有很多其他方法可以消除警告,包括:
- 添加一个空的构造函数
- 将 Init() 移至构造函数并在循环中调用placement new
但我想避免改变代码的结构。
我尝试了以下注释但没有成功:
void _At_(this, _Out_) Init();
此语法被接受,但仅将警告更改为:
warning C6001: Using uninitialized memory 'buffer'.: Lines: 18, 20, 21
warning C6001: Using uninitialized memory 'buffer[BYTE:0]'.: Lines: 18, 20, 21
有谁知道我如何向静态分析引擎声明这个 Init() 函数的意图?