【问题标题】:cppcheck considers that variables used in macro are not usedcppcheck 认为宏中使用的变量没有被使用
【发布时间】:2021-05-15 18:57:06
【问题描述】:

比如我有这个sn-p:

const int array_type = model.accessors[accessor_index].type;
Assert(array_type == TypeCode<T>(), "");

我得到这个错误:

Src/Engine/Animation/GltfLib.cpp:103:26: style: Variable 'array_type' is assigned a value that is never used. [unreadVariable]
    const int array_type = model.accessors[accessor_index].type;

Assert 是一个基于常规 assert 的宏,但在引发错误的基础上使用了一些内部日志记录机制。

有没有办法让 cppcheck 注意到变量被实际使用了?

【问题讨论】:

  • 如果Assert 宏是基于标准库的assert 宏,那么这段代码确实可以不使用array_type。当assert 被禁用时会发生这种情况。
  • 为了让 cppcheck 满意,我需要让代码仅在启用 Assert 时可用?
  • 对于标准库的 assert 宏,使用 model.accessors[accessor_index].type == TypeCode&lt;T&gt;() 并删除 array_type 可能会消除警告。

标签: c++ macros static-analysis cppcheck


【解决方案1】:

警告告诉您:当Assert 被禁用时,您正在创建一个从未使用过的变量。

我建议将语句移到 assert 语句中;但是,您也可以在禁用调试时使用处理器删除代码。

Assert(model.accessors[accessor_index].type == TypeCode<T>(), "");

另一方面,如果您确实需要该行代码(可能是因为std::map::operator[] 是非常量),那么您应该在断言行中使用at 并添加注释。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-02
    • 1970-01-01
    • 2019-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多