为什么这个z3方程失败了?

时间:2018-03-14 15:18:42

标签: python z3 z3py

我需要解决这段代码(C中的代码)

if ( ((0xAAAAAAAAAAAAAAABLL * len_input_serial >> 64) >> 1)+ len_input_serial- 3 * ((0xAAAAAAAAAAAAAAABLL * len_input_serial >> 64) >> 1) != 14)
    return 0xFFFFFFFFLL;

这是我的python脚本

from z3 import *
len_input_serial = BitVec("serial_len",64)
solve(LShR(LShR(0xAAAAAAAAAAAAAAABL * len_input_serial,64),1) + len_input_serial - 3 * LShR(LShR(0xAAAAAAAAAAAAAAABL * len_input_serial,64),1) == 14)

然而,这给了我[serial_len = 14]

我知道解决方案应该在[42,38,40]附近,所以这里有什么问题?

1 个答案:

答案 0 :(得分:1)

这个表达式:

sudo port install octave

始终等同于(0xAAAAAAAAAAAAAAABLL * len_input_serial >> 64) >> 1 。如果右移64位数量到64位,则得到0.(请注意,您使用的是0,它将输入视为无符号数量。)

因此整个事情简化为解决LShr,这是Z3正在产生的答案。

请注意,当您在Python中写入一个长整数(即0x123L等)时,您将获得无限精度。 (见这里:Maximum value for long integer)。在C中,您获得(最可能的)64位整数。所以,你的Z3代码实际上是正确的;它的Python在这里使用更高的精度,从而引起混乱。