【发布时间】:2011-05-04 10:21:44
【问题描述】:
unsigned char a, b;
b = something();
a = ~b;
一个静态分析器抱怨最后一行被截断,大概是因为b 在其位被翻转之前被提升为 int 并且结果将是 int 类型。
我只对提升的 int 的最后一个字节感兴趣 - 如果 b 是 0x55,我需要 a 是 0xAA。我的问题是,C 规范是否说明了截断是如何发生的,还是实现定义/未定义?是否保证a 将始终获得我期望的值,还是在符合标准的平台上会出错?
当然,在分配之前强制转换结果会使静态分析器静音,但我想知道首先忽略此警告是否安全。
【问题讨论】:
-
我会说这是一个虚假的警告。我刚刚通过 clang 静态分析器运行了你的代码,它没有抱怨。
something()的返回类型是什么 -
@Jeremy 这是一个示例代码来说明场景。真正的代码类似于
mask1[0] = ~mask2[0];,其中两者都是 unsigned char 类型的数组。显然,我的静态分析器不如 clang 聪明 :)
标签: c bitwise-operators integer-promotion