使用Python z3库做算法仿真时位异或操作报sort mismatch错误如何解决
错误根因
你遇到的sort mismatch是Z3运算时类型不匹配抛出的异常,具体触发原因有两个:
State初始化时self.state的所有元素都是Python原生整数,后续存储符号化的BitVec值参与运算时,两种类型无法直接做按位运算mag函数的返回值是Python原生整数,没有转成Z3的BitVec类型,和BitVec类型的变量做异或时类型不匹配
修复步骤
- 调整
State类的初始化逻辑,初始的状态值全部统一为32位BitVec常量
class State: def __init__(self): # 所有初始值转为32位BitVec常量,和seed类型统一 self.state = [z3.BitVecVal(0, 32) for _ in range(0x270)] self.index = 0
- 修改
mag函数,返回值统一为32位BitVec类型
def mag(i): # 返回值转32位BitVec常量,确保运算类型一致 return z3.If(i == 0, z3.BitVecVal(0x0, 32), z3.BitVecVal(0x9908b0df, 32))
- 可选优化:把运算中用到的
0x7fffffff、0x80000000等Python原生常量也用z3.BitVecVal(常量值, 32)包裹,避免隐式类型转换带来的潜在问题,修改后的运算代码如下:
s.state[i] = s.state[i + 0x18d] ^ ((s.state[i + 1] & z3.BitVecVal(0x7fffffff, 32) | s.state[i] & z3.BitVecVal(0x80000000, 32)) >> 1) ^ mag((s.state[1] & 1) *8)
做完以上修改后,所有运算对象都是32位BitVec类型,就不会再触发类型不匹配的异常。
内容的提问来源于stack exchange,提问作者PaoloJ42
相关产品推荐
相关产品推荐

