溢出检查Frama-C的无效断言

时间:2016-10-05 07:59:26

标签: static-analysis frama-c

在检查添加操作的<div class="container"><input id="zoomCheck" type="checkbox" /> <label for="zoomCheck"> <img src="map.jpg" /> </label></div> short数据类型的溢出时,Frama-C插入的断言似乎不正确:

enter image description here

对于char和short数据,最大正值和负值都是整数数据类型。

这可能是什么原因?

1 个答案:

答案 0 :(得分:1)

在算术运算中使用时,小于int的积分类型将转换为intunsigned(参见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;
}

不会有任何向下警告(但会出现签名的溢出警告)。