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

局部对象在使用前应被初始化

8.9 ID_localInitialization
目录 › next › previous

在函数作用域内定义的,不受 static、extern、local_thread 等关键字限定的对象简称局部对象,未初始化的局部对象具有不确定的值,读取未初始化的对象会导致标准未定义的行为。

示例:

int foo() {
    int a;        // A local object(automatic storage duration)
    if (cond) {
        a = 0;
    }
    return a;     // Non-compliant, may be an indeterminate value
}

当例中条件 cond 为假时,局部对象 a 的值是不确定的。

建议对象在声明处初始化,即使不方便在声明处初始化,也应该在声明的附近设定对象的值:

int a = 0;   // Good

int b;
b = 123;     // OK

不建议的方式:

int a;
if (x) {
    a = 0;
}
....
if (y) {
    use(a);   // Dangerous
}

例中 a 是否被初始化依赖条件 x,并在满足条件 y 时被使用,即使条件 x 和条件 y 有一定相关性可以保证对 a 的使用是正确的,也会造成潜在的维护困难,当条件比较复杂或有变化时极易出错。

相关

ID_illAccess ID_dynamicInitialization

依据

ISO/IEC 9899:1999 6.2.4(5 6) ISO/IEC 9899:2011 6.2.4(6 7) ISO/IEC 9899:2011 6.3.2.1(2)-undefined ISO/IEC 14882:2003 4.1(1)-undefined ISO/IEC 14882:2003 8.5(9) ISO/IEC 14882:2011 4.1(1)-undefined ISO/IEC 14882:2011 8.5(11)

参考

CWE-457 C++ Core Guidelines ES.20 MISRA C 2004 9.1 MISRA C 2012 9.1 MISRA C++ 2008 8-5-1
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.