我应该如何处理验证代码的正确性,以避免效率低下,依赖于模块化算法?依赖无符号整数溢出的代码证明?
#include <stdint.h>
uint32_t my_add(uint32_t a, uint32_t b) {
uint32_t r = a + b;
if (r < a)
return UINT32_MAX;
return r;
}
我已经尝试过WP的“INT”的模式,但是,如果我理解正确的话,这种模式配置逻辑整数的采购订单中的语义,而不是C代码的正式模型。例如,在使用“int”模型时,WP和RTE插件仍然需要并注入上面的无符号加法的溢出断言PO。
在这种情况下,我可以添加注释来规定语句或基本块的逻辑模型,这样我可以告诉Frama-C一个特定的编译器如何实际解释语句?如果是这样的话,我可以使用其他验证技术来处理诸如无符号环绕,编译器定义行为,非标准行为(内联组合)等定义但经常缺陷的行为,然后证明其正确性周围的代码。我想象的是类似于(但更强大)的“断言修复”,它用于通知某些静态分析器当某些属性无法为其自身派生属性时保留某些属性。
我正在使用Frama-C氟-20130601作为参考,使用alt-ergo 95.1。
一你的代码有问题:让'a'为'UINT32_MIN'并让'b'为'-1'。这是如何处理的? (我没有你的工具/特定编译器的背景) – BLaZuRE
@BLaZuRE:b是无符号的,所以不能是-1。 –