es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Incompatibilidad de ordenación de z3 para diferentes bytes de la misma variable.

Estoy simulando el comportamiento de un algoritmo utilizando el paquete z3 de Python, sin embargo, me estoy encontrando con problemas al usar el operador XOR a nivel de bits.

Al principio, defino lo siguiente:

class State:
    def __init__(self):
        self.state = [0] * 0x270
        self.index = 0

def mag(i):
    return z3.If(i == 0, 0x0, 0x9908b0df)

semilla = z3.BitVec(‘semilla’, 32)
s = State()

Y el script continúa, sin embargo, cuando ejecuto el Solucionador, obtengo una excepción de tipo “z3.z3types.Z3Exception: tipo de dato incorrecto” causada por intentar ejecutar el operador xor en la línea:

s.state[i] = s.state[i + 0x18d] ^ ((s.state[i + 1] & 0x7fffffff | s.state[i] & 0x80000000) >> 1) ^ mag((s.state[1] & 1) * 8)

Aquí, cada entrada en s.state depende del valor simbólico de la semilla.

Soy principiante en este tipo de solucionadores y no estoy seguro de qué causa exactamente el problema.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El error “sort mismatch” se produce cuando se intenta realizar una operación, como el XOR a nivel de bits, en dos valores que pertenecen a diferentes tipos de datos o clases. En este caso, es probable que la variable seed y los elementos de s.state tengan diferentes clases.

    Para resolver este problema, asegúrate de que todas las variables y expresiones utilizadas en el algoritmo tengan la misma clase. Una solución sería convertir la variable seed a la misma clase que los elementos de s.state. Por ejemplo, podrías usar la función z3.BitVecVal para crear un nuevo vector de bits con el mismo ancho que los elementos de s.state y luego realizar el XOR con los elementos de s.state:

    s.state[i] = s.state[i + 0x18d] ^ ((s.state[i + 1] & 0x7fffffff | s.state[i] & 0x80000000) >> 1) ^ mag((s.state[1] & 1) * 8) ^ z3.BitVecVal(seed.as_long(), len(s.state[0]))
    

    Alternativamente, podrías convertir los elementos de s.state a una clase diferente, como una clase booleana, para que puedan ser XOReados con seed:

    s.state[i] = z3.Bool(s.state[i + 0x18d]) ^ z3.Bool((s.state[i + 1] & 0x7fffffff | s.state[i] & 0x80000000) >> 1) ^ mag((s.state[1] & 1) * 8) ^ z3.Bool(seed)
    

    Recuerda también definir la clase adecuada para la función mag, si es necesario.

Comments are closed.