在检查添加操作的<div class="container"><input id="zoomCheck" type="checkbox" />
<label for="zoomCheck">
<img src="map.jpg" />
</label></div>
和short
数据类型的溢出时,Frama-C插入的断言似乎不正确:
对于char和short数据,最大正值和负值都是整数数据类型。
这可能是什么原因?
答案 0 :(得分:1)
在算术运算中使用时,小于int
的积分类型将转换为int
或unsigned
(参见C11 6.3.1.8常规算术转换)。这就是为什么您会看到(int)
和x
的演员y
。请注意,默认情况下-rte
不会发出向下转发的警告,因为它们不是未定义的行为(6.3.1.3§3表示已签名的向下转发是实现定义的,并且实现可能会引发信号)。如果你添加选项-warn-signed-downcast
,你会看到你可能正在寻找的断言,这是由于转换为(char)
的结果:
/*@ assert rte: signed_downcast: (int)x+(int)y ≤ 127; */
/*@ assert rte: signed_downcast: -128 ≤ (int)x+(int)y; */
请注意,如果将结果存储到int中,如
void main(void) {
char x;
char y;
int z;
x = 1;
y = 127;
z = x + y;
return;
}
不会有任何向下警告(但会出现签名的溢出警告)。