-logical-signed-right-shift
指定对有符号变量执行逻辑右移时如何处理符号位
描述
对负值执行右移位运算时在算术移位和逻辑移位之间进行选择。
此选项不会修改编译时表达式。有关更多详细信息,请参阅限制。
为何使用此选项
C99 标准(第 6.5.7 节)规定:对于右移位运算 x1>>x2,如果 x1 是有符号数并且具有负值,则行为由实现定义。不同的编译器会在算术移位和逻辑移位之间进行选择。使用此选项来模拟您的编译器。
设置
默认值:算术
- 算术
保留符号位:
(-4) >> 1 = -2 (-7) >> 1 = -4 7 >> 1 = 3
- 逻辑
0 替换符号位:
(-4) >> 1 = (-4U) >> 1 = 2147483646 (-7) >> 1 = (-7U) >> 1 = 2147483644 7 >> 1 = 3
限制
在编译时表达式中,此 Polyspace® 选项不会更改右移位的标准行为。
例如,考虑以下右移位表达式:
int arr[ ((-4) >> 20) ];
(-4) >> 20 在编译时计算。从逻辑上,此表达式等效于 4095。但从算术上,结果为 -1。此语句会导致编译错误(数组大小不能为负值),因为有符号整数的标准右移位行为是算术移位。命令行信息
当使用命令行时,算术移位为默认计算模式。设置此选项后,将执行逻辑计算。
参数:-logical-signed-right-shift |
| 默认值:算术有符号数右移位 |
示例 (Bug Finder):polyspace-bug-finder -logical-signed-right-shift |
示例 (Code Prover):polyspace-code-prover -logical-signed-right-shift |
示例 (Bug Finder Server):polyspace-bug-finder-server -logical-signed-right-shift |
示例 (Code Prover Server):polyspace-code-prover-server -logical-signed-right-shift |