不应存在无效的写入操作
8.21 ID_invalidWrite
内存中的数据写入之后应被读取,如果出现:
- 写入后未经读取便再次被无条件写入
- 写入后未经读取而相关对象的生命周期已结束
这种写入是无效的,出现这种问题往往意味着逻辑错误或功能不完整。
下列情况可不受本规则约束:
- 对象初始化时的写入
- 有特殊副作用的写入,如对 volatile 型数据的写入等
示例:
void foo(int& a, int& b) {
....
a = 123; // Non-compliant
a = 456;
....
}
例中参数 a 被赋值为 123 之后,又被无条件地赋值为 456,显然第一次赋值是没有意义的,很有可能是漏掉了什么。
又如:
int bar() {
int i = 0;
....
return i++; // Non-compliant
}
例中 bar 函数返回局部变量 i 自增前的值,自增运算是没有意义的。
对象的初始化可不受本规则限制,如:
int baz() {
int n = 0; // OK
if (cond) {
n = 123;
} else {
n = 456;
}
return n;
}
例中局部变量 n 初始化后经由 if-else 分枝,在其两个分枝中都被赋值,也相当于被无条件写入,但在声明处初始化是值得提倡的,故这种情况不受本规则限制。