使用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;
}
screenshot of Alarms generated
谢谢。