如何添加循环不变以限制或限制frama-c中的整数? (绑定整数的前提)

时间:2019-03-31 22:25:04

标签: c frama-c

使用frama-c,我需要分析Euclid算法,以计算具有Bezozut系数的两个数之间的最大公约数。该算法将两个正整数 x y 作为输入,并计算两个整数s和t,使得 s·x + t·y = gcd(x,y)

当我使用

运行代码时
  

frama-c-gui -val euclidEVA.c

为了分析,我产生了一些未签名的溢出和超出范围的写警报。

///*@
    //requires ...
//*/
int main(int x, int y, int* pp, int* qp) 
{
    int s = 1, t = 0, u = 0, v = 1;
    ///*@
          //loop invariant ...
    //*/
    while(y > 0)
    {
        int r = x % y;
        int q = x / y;
        x = y; 
                y = r;
        int w = u;
                u = s - u * q; 
                s = w;
                w = v;
        v = t - v * q;
        t = w;

    }   
    *pp = s; *qp = t;
    return x;
}
  • 我可以添加哪些先决条件来验证内存访问?
  • 我可以添加哪些循环不变式来限制 s t
  • 我可以为绑定的 u v 添加什么循环不变式?
  • 我可以在开始时为 x y 的边界添加什么前提?
  • 请您对警报产生任何评论(有符号溢出和越界写入)?

screenshot of Alarms generated

谢谢。

0 个答案:

没有答案