Coverity 抱怨 htonl 操作数,但为什么呢?
Coverity complains about htonl operands but why?
此代码将本地切换转换为传出网络顺序布尔值(实际上是一个 32 位 uint)并且至少已有 10 年历史,但 Coverity 最近才开始抱怨它。我不明白问题是什么以及它从哪里得到“操作数|”从。问题是 htonl 只适用于 32 位值,而我们有 16 位值的 htons 吗?
这是误检吗?
struct network_response_t {
uint32_t exclusive;
}
bitmap16_t mode_t {
TYPE_MIXED = 0x0,
TYPE_EXCLUSIVE = 0x1,
...
}
mode_t local_mode;
network_response_t response;
response.exclusive = htonl((local_mode & TYPE_EXCLUSIVE) ? 1 : 0);
错误:
Operands don't affect result (CONSTANT_EXPRESSION_RESULT)
result_independent_of_operands: (__uint16_t)((__uint32_t)((local_mode
& TYPE_EXCLUSIVE) ? 1 : 0) & 65535) >> 8 is 0 regardless of the values
of its operands. This occurs as the bitwise second operand of "|".
这是误报。在小端平台上,htonl
进行端交换,提取参数的字节并使用按位或运算符以相反的顺序将它们放回原处。 Coverity 正确地意识到这些字节之一将始终为零,因为在这种情况下原始参数始终为 0 或 1。但得出事实是无意的结论是错误的。
我建议将此情况报告给 Coverity 的支持团队,以便他们进行修复。
此代码将本地切换转换为传出网络顺序布尔值(实际上是一个 32 位 uint)并且至少已有 10 年历史,但 Coverity 最近才开始抱怨它。我不明白问题是什么以及它从哪里得到“操作数|”从。问题是 htonl 只适用于 32 位值,而我们有 16 位值的 htons 吗? 这是误检吗?
struct network_response_t {
uint32_t exclusive;
}
bitmap16_t mode_t {
TYPE_MIXED = 0x0,
TYPE_EXCLUSIVE = 0x1,
...
}
mode_t local_mode;
network_response_t response;
response.exclusive = htonl((local_mode & TYPE_EXCLUSIVE) ? 1 : 0);
错误:
Operands don't affect result (CONSTANT_EXPRESSION_RESULT) result_independent_of_operands: (__uint16_t)((__uint32_t)((local_mode & TYPE_EXCLUSIVE) ? 1 : 0) & 65535) >> 8 is 0 regardless of the values of its operands. This occurs as the bitwise second operand of "|".
这是误报。在小端平台上,htonl
进行端交换,提取参数的字节并使用按位或运算符以相反的顺序将它们放回原处。 Coverity 正确地意识到这些字节之一将始终为零,因为在这种情况下原始参数始终为 0 或 1。但得出事实是无意的结论是错误的。
我建议将此情况报告给 Coverity 的支持团队,以便他们进行修复。