☰
  • 首页
  • 规则分类
  • 项目介绍
search
•••

不应存在无效的写入操作

8.21 ID_invalidWrite
目录 › next › previous

内存中的数据写入之后应被读取,如果出现:

  • 写入后未经读取便再次被无条件写入
  • 写入后未经读取而相关对象的生命周期已结束

这种写入是无效的,出现这种问题往往意味着逻辑错误或功能不完整。

下列情况可不受本规则约束:

  • 对象初始化时的写入
  • 有特殊副作用的写入,如对 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 分枝,在其两个分枝中都被赋值,也相当于被无条件写入,但在声明处初始化是值得提倡的,故这种情况不受本规则限制。

参考

CWE-563
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.