【发布时间】:2021-02-05 03:02:10
【问题描述】:
此代码将本地切换转换为传出网络顺序布尔值(实际上是 32 位 uint),并且至少有 10 年的历史,但 Coverity 最近才开始抱怨它。我不明白问题是什么以及它在哪里得到“操作数|”从。问题是 htonl 只适用于 32 位值,而我们有 16 位的 hton 吗? 这是误检吗?
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);
错误:
操作数不影响结果 (CONSTANT_EXPRESSION_RESULT) result_independent_of_operands: (__uint16_t)((__uint32_t)((local_mode & TYPE_EXCLUSIVE) ? 1 : 0) & 65535) >> 8 为 0 与值无关 的操作数。这作为“|”的按位第二个操作数出现。
【问题讨论】:
-
uint32_t mode_exclusive = (local_mode & TYPE_EXCLUSIVE) ? 1 : 0; response.exclusive = htonl(mode_exclusive);是一种解决方法吗?mode_t似乎是uint16_t(因为它是用bitmap16_t定义的),这可能是问题所在。错误消息中对__uint16_t的额外转换可能证实了这一点,否则,我认为没有理由。
标签: c++ c networking coverity htonl