Klocwork扫描C++报std::vector成员UNINIT.CTOR.MUST未初始化错误如何解决
Klocwork UNINIT.CTOR.MUST 告警解决方案
告警根因
从C++语法层面看你原本的代码不存在未定义行为:std::vector作为STL标准容器自带默认构造函数,会自动将实例初始化为合法的空容器状态。触发该告警的原因有两个:
- Klocwork的
UNINIT.CTOR.MUST规则要求所有类成员必须在构造函数中显式初始化,不认可依赖成员类型默认构造的隐式初始化行为 - 静态扫描识别到你在构造函数执行过程中就将
this指针传递给了InitializeSaResults、CreateNVMData两个外部函数,且后续存在该成员的读取逻辑,工具无法确认这些外部函数会不会在你填充成员之前访问它,因此判定存在风险
推荐解决方案
方案1:显式初始化成员(最优,无副作用)
直接在构造函数初始化列表中显式调用vector的默认构造,或者在类内声明时给初始化值,完全符合扫描规则,也不会改变vector初始为空的状态,不影响你后续在其他函数填充数据的逻辑:
写法1:构造函数初始化列表初始化
修改构造函数实现:
IpuCCAInterfaceBase::IpuCCAInterfaceBase() : _remaining_run_kernels_uuids() // 显式调用vector默认构造 { }
写法2:类内成员初始化(C++11及以上版本适用)
修改头文件中的成员声明:
class COMMON_CCA_INTERFACE IpuCCAInterfaceBase : public ICCAOperations { private: vector<int> _remaining_run_kernels_uuids{}; // 类内显式初始化空容器 }
方案2:告警抑制(仅当你完全确认访问逻辑安全时使用)
如果你100%确认InitializeSaResults、CreateNVMData两个函数不会访问_remaining_run_kernels_uuids成员,且143行的读取操作一定发生在你填充该成员之后,可以添加Klocwork专用的抑制注释消除告警:
在构造函数上方添加:
/* klocwork suppress UNINIT.CTOR.MUST 该成员为vector默认构造已合法,延后在xxx函数中初始化 */ IpuCCAInterfaceBase::IpuCCAInterfaceBase() { }
注意:该方案存在风险,如果后续代码逻辑变动导致成员在填充前被访问,会引入难排查的问题,非必要不推荐使用。
内容的提问来源于stack exchange,提问作者Gilad
相关产品推荐
相关产品推荐

