예제 #1
0
def test_to_tuple_from_tuple():
    assert RelocatableValue.to_tuple(5) == (5, )
    assert RelocatableValue.from_tuple((5, )) == 5

    x = RelocatableValue(1, 2)
    assert RelocatableValue.to_tuple(x) == (1, 2)
    assert RelocatableValue.from_tuple((1, 2)) == x
예제 #2
0
 def extend_additional_data(self,
                            data,
                            relocate_callback,
                            data_is_trusted=True):
     for addr, signature in data:
         self.signatures[relocate_callback(
             RelocatableValue.from_tuple(addr))] = signature
def test_validated_memory_dict():
    memory = MemoryDict()
    memory_validator = ValidatedMemoryDict(memory=memory)

    def rule_identical_pairs(mem, addr):
        """
        Validates that the values in address pairs (i, i+1), where i is even, are identical.
        """
        offset_diff = (-1) ** (addr.offset % 2)
        other_addr = RelocatableValue.from_tuple((addr.segment_index, addr.offset + offset_diff))
        if other_addr in mem:
            assert mem[addr] == mem[other_addr]
            return {addr, other_addr}
        return set()

    def rule_constant_value(mem, addr, constant):
        assert mem[addr] == constant, \
            f'Expected value in address {addr} to be {constant}, got {mem[addr]}.'
        return {addr}

    memory_validator.add_validation_rule(1, lambda memory, addr: set())
    memory_validator.add_validation_rule(2, lambda memory, addr: {addr})
    memory_validator.add_validation_rule(3, rule_identical_pairs)
    memory_validator.add_validation_rule(4, rule_constant_value, 0)

    addr0 = RelocatableValue.from_tuple((1, 0))
    addr1 = RelocatableValue.from_tuple((2, 0))
    addr2 = RelocatableValue.from_tuple((3, 0))
    addr3 = RelocatableValue.from_tuple((3, 1))
    addr4 = RelocatableValue.from_tuple((4, 0))

    # Test validated_addresses update.
    memory_validator[addr0] = 0
    assert memory_validator._ValidatedMemoryDict__validated_addresses == set()
    memory_validator[addr1] = 0
    assert memory_validator._ValidatedMemoryDict__validated_addresses == {addr1}
    # Test validation rule application.
    memory_validator[addr2] = 1
    assert memory_validator._ValidatedMemoryDict__validated_addresses == {addr1}
    memory_validator[addr3] = 1
    assert memory_validator._ValidatedMemoryDict__validated_addresses == {addr1, addr2, addr3}

    with pytest.raises(
            AssertionError, match='Expected value in address 4:0 to be 0, got 1.'):
        memory_validator[addr4] = 1
 def rule_identical_pairs(mem, addr):
     """
     Validates that the values in address pairs (i, i+1), where i is even, are identical.
     """
     offset_diff = (-1) ** (addr.offset % 2)
     other_addr = RelocatableValue.from_tuple((addr.segment_index, addr.offset + offset_diff))
     if other_addr in mem:
         assert mem[addr] == mem[other_addr]
         return {addr, other_addr}
     return set()
예제 #5
0
 def _deserialize(self, value, attr, data, **kwargs):
     return {
         RelocatableValue.from_tuple(x): RelocatableValue.from_tuple(y)
         for x, y in value
     }
예제 #6
0
 def _deserialize(self, value, attr, data, **kwargs):
     return RelocatableValue.from_tuple(value)
예제 #7
0
    def extend_additional_data(self, data, relocate_callback, data_is_trusted=True):
        if not data_is_trusted:
            return

        for addr in data:
            self.verified_addresses.add(relocate_callback(RelocatableValue.from_tuple(addr)))
예제 #8
0
 def extend_additional_data(self, data, relocate_callback):
     for addr in data:
         self.verified_addresses.add(
             relocate_callback(RelocatableValue.from_tuple(addr)))