局部对象在使用前应被初始化
8.9 ID_localInitialization
在函数作用域内定义的,不受 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 的使用是正确的,也会造成潜在的维护困难,当条件比较复杂或有变化时极易出错。
相关
依据
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