Exemple #1
0
    def test_data_blocks(self):
        b = gtirb.DataBlock()

        self.assertEquals(b.address, None)
        self.assertEquals(b.contents, b"")
        self.assertEquals(set(b.references), set())

        bi = gtirb.ByteInterval(address=1, contents=b"abcd1234")
        b.offset = 2
        b.size = 3
        b.byte_interval = bi

        self.assertEquals(b.address, 3)
        self.assertEquals(b.contents, b"cd1")
        self.assertEquals(set(b.references), set())

        s = gtirb.Section()
        bi.section = s
        m = gtirb.Module(name="M")
        sym1 = gtirb.Symbol("test", payload=b)
        sym2 = gtirb.Symbol("test", payload=123)
        sym3 = gtirb.Symbol("test", payload=b)
        m.symbols |= {sym1, sym2, sym3}
        s.module = m

        self.assertEquals(b.address, 3)
        self.assertEquals(b.contents, b"cd1")
        self.assertEquals(set(b.references), {sym1, sym3})
Exemple #2
0
    def test_data_block(self):
        id1 = uuid.uuid4()
        id2 = uuid.uuid4()

        b1 = gtirb.DataBlock(size=1, offset=3, uuid=id1)
        b2 = gtirb.DataBlock(size=1, offset=3, uuid=id1)
        self.assertTrue(b1.deep_eq(b2))

        b2 = gtirb.DataBlock(size=5, offset=3, uuid=id1)
        self.assertFalse(b1.deep_eq(b2))

        b2 = gtirb.DataBlock(size=1, offset=5, uuid=id1)
        self.assertFalse(b1.deep_eq(b2))

        b2 = gtirb.DataBlock(size=1, offset=3, uuid=id2)
        self.assertFalse(b1.deep_eq(b2))
def test_insert_bytes():
    ir = gtirb.IR()
    m = gtirb.Module(isa=gtirb.Module.ISA.X64)
    m.ir = ir
    s = gtirb.Section(name=".text")
    s.module = m
    bi = gtirb.ByteInterval(contents=b"\x00\x01\x02\x03\x04\x05\x06\x07",
                            address=0x1000)
    bi.section = s
    b = gtirb.CodeBlock(offset=2, size=2)
    b.byte_interval = bi
    b2 = gtirb.DataBlock(offset=6, size=2)
    b2.byte_interval = bi
    bi.symbolic_expressions[6] = gtirb.SymAddrConst(0, None)
    ctx = gtirb_capstone.RewritingContext(ir)
    ctx.modify_block_insert(m, b, b"\x08\x09", 1)
    assert bi.address == 0x1000
    assert bi.size == 10
    assert bi.contents == b"\x00\x01\x02\x08\x09\x03\x04\x05\x06\x07"
    assert b.offset == 2
    assert b.size == 4
    assert b2.offset == 8
    assert b2.size == 2
    assert 6 not in bi.symbolic_expressions
    assert 8 in bi.symbolic_expressions
Exemple #4
0
 def test_from_uuid_typed(self):
     nodes = (
         gtirb.IR(),
         gtirb.Module(),
         gtirb.CodeBlock(size=0),
         gtirb.DataBlock(size=0),
         gtirb.ProxyBlock(),
         gtirb.Section(name="test"),
         gtirb.Symbol(name="test"),
         gtirb.ByteInterval(),
     )
     for node1 in nodes:
         with self.subTest(type(node1).__name__):
             for node_cls in map(type, nodes):
                 node2 = None
                 try:
                     node2 = node_cls.from_uuid(node1.uuid)
                 except TypeError:
                     if node_cls == type(node1):
                         self.fail(
                             "%s.from_uuid raised error returning node of"
                             "its own type" % node_cls)
                 else:
                     if node_cls != type(node1):
                         self.fail("%s.from_uuid returned despite getting"
                                   "argument for a node of type %s" %
                                   (node_cls, type(node1)))
                     else:
                         self.assertEqual(node1, node2)
    def test_insert_bytes(self):
        ir = gtirb.IR()
        m = gtirb.Module()
        m.ir = ir
        s = gtirb.Section(name=".text")
        s.module = m
        bi = gtirb.ByteInterval(contents=b"\x00\x01\x02\x03\x04\x05\x06\x07")
        bi.section = s
        b = gtirb.CodeBlock(offset=2, size=2)
        b.byte_interval = bi
        b2 = gtirb.DataBlock(offset=6, size=2)
        b2.byte_interval = bi
        bi.symbolic_expressions[6] = gtirb.SymAddrConst(0, None)

        ctx = gtirb_capstone.RewritingContext(ir)
        ctx.modify_block_insert(m, b, b"\x08\x09", 1)

        self.assertEqual(bi.size, 10)
        self.assertEqual(
            bi.contents, b"\x00\x01\x02\x08\x09\x03\x04\x05\x06\x07"
        )
        self.assertEqual(b.offset, 2)
        self.assertEqual(b.size, 4)
        self.assertEqual(b2.offset, 8)
        self.assertEqual(b2.size, 2)
        self.assertNotIn(6, bi.symbolic_expressions)
        self.assertIn(8, bi.symbolic_expressions)
Exemple #6
0
    def test_byte_blocks(self):
        s = gtirb.Section()

        bi1 = gtirb.ByteInterval(size=4, section=s)
        bi1_code_block = gtirb.CodeBlock(offset=0, size=1, byte_interval=bi1)
        bi1_data_block = gtirb.DataBlock(offset=1, size=1, byte_interval=bi1)

        bi2 = gtirb.ByteInterval(size=4, section=s)
        bi2_code_block = gtirb.CodeBlock(offset=0, size=1, byte_interval=bi2)
        bi2_data_block = gtirb.DataBlock(offset=1, size=1, byte_interval=bi2)

        self.assertEqual(
            set(s.byte_blocks),
            {bi1_code_block, bi1_data_block, bi2_code_block, bi2_data_block},
        )
        self.assertEqual(set(s.code_blocks), {bi1_code_block, bi2_code_block})
        self.assertEqual(set(s.data_blocks), {bi1_data_block, bi2_data_block})
Exemple #7
0
    def test_data_blocks_at(self, scope):
        "Test that data_blocks_at only gives back DataBlocks"
        ir, m, s, bi = create_interval_etc(address=0x1000, size=4)
        search_in = scope.select(ir, m, s, bi)

        code_block = gtirb.CodeBlock(offset=0, size=1, byte_interval=bi)
        data_block = gtirb.DataBlock(offset=0, size=1, byte_interval=bi)

        found = set(search_in.data_blocks_at(0x1000))
        self.assertEqual(found, {data_block})
Exemple #8
0
 def test_byte_interval(self):
     node = gtirb.ByteInterval(
         address=0x123,
         initialized_size=456,
         size=789,
         contents=b"abc",
         blocks=(gtirb.DataBlock(size=0),),
         symbolic_expressions={
             1: gtirb.SymAddrConst(offset=1, symbol=gtirb.Symbol("test"))
         },
     )
     string = repr(node)
     new_node = eval(string)
     self.assertTrue(node.deep_eq(new_node))
Exemple #9
0
 def test_from_uuid(self):
     for node1 in (
             gtirb.IR(),
             gtirb.Module(),
             gtirb.CodeBlock(size=0),
             gtirb.DataBlock(size=0),
             gtirb.ProxyBlock(),
             gtirb.Section(name="test"),
             gtirb.Symbol(name="test"),
             gtirb.ByteInterval(),
     ):
         with self.subTest(type(node1).__name__):
             node2 = gtirb.Node.from_uuid(node1.uuid)
             self.assertEqual(node1, node2)
Exemple #10
0
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

        ir = gtirb.IR()
        m = gtirb.Module(
            binary_path="binary_path",
            file_format=gtirb.Module.FileFormat.RAW,
            isa=gtirb.Module.ISA.ValidButUnsupported,
            name="name",
            preferred_addr=1,
            rebase_delta=2,
        )
        m.ir = ir
        s = gtirb.Section(
            name="name",
            flags=(
                gtirb.Section.Flag.Executable,
                gtirb.Section.Flag.Readable,
                gtirb.Section.Flag.Loaded,
                gtirb.Section.Flag.Initialized,
            ),
        )
        s.module = m
        bi = gtirb.ByteInterval(address=0, size=10, contents=b"abcd")
        bi.section = s
        cb = gtirb.CodeBlock(size=4, offset=0, decode_mode=1)
        cb.byte_interval = bi
        db = gtirb.DataBlock(size=6, offset=4)
        db.byte_interval = bi
        sym = gtirb.Symbol(name="name", payload=cb)
        sym.module = m
        sac = gtirb.SymAddrConst(0, sym,
                                 {gtirb.SymbolicExpression.Attribute.Part1})
        bi.symbolic_expressions[2] = sac
        p = gtirb.ProxyBlock()
        p.module = m
        ir.cfg.add(
            gtirb.Edge(
                cb,
                p,
                gtirb.Edge.Label(type=gtirb.Edge.Type.Branch,
                                 conditional=False,
                                 direct=True),
            ))
        ir.cfg.add(gtirb.Edge(p, p))
        m.aux_data["key"] = gtirb.AuxData(gtirb.Offset(s, 777), "Offset")
        ir.aux_data["key"] = gtirb.AuxData("value", "string")

        self.ir = ir
Exemple #11
0
 def test_data_object(self):
     node = gtirb.DataBlock(offset=123, size=456)
     string = repr(node)
     new_node = eval(string)
     self.assertTrue(node.deep_eq(new_node))
Exemple #12
0
    def test_byte_intervals(self):
        id1 = uuid.uuid4()
        id2 = uuid.uuid4()
        id3 = uuid.uuid4()
        id4 = uuid.uuid4()
        id5 = uuid.uuid4()
        id6 = uuid.uuid4()

        b1 = gtirb.ByteInterval(
            address=1,
            contents=b"abcd",
            size=4,
            initialized_size=4,
            blocks=(
                gtirb.DataBlock(size=1, offset=3, uuid=id2),
                gtirb.CodeBlock(size=1, decode_mode=2, offset=3, uuid=id3),
            ),
            symbolic_expressions={
                2:
                gtirb.SymAddrConst(
                    3, gtirb.Symbol(name="name1", payload=4, uuid=id4)),
                3:
                gtirb.SymStackConst(
                    4, gtirb.Symbol(name="name2", payload=8, uuid=id5)),
            },
            uuid=id1,
        )
        b2 = gtirb.ByteInterval(
            address=1,
            contents=b"abcd",
            size=4,
            initialized_size=4,
            blocks=(
                gtirb.DataBlock(size=1, offset=3, uuid=id2),
                gtirb.CodeBlock(size=1, decode_mode=2, offset=3, uuid=id3),
            ),
            symbolic_expressions={
                2:
                gtirb.SymAddrConst(
                    3, gtirb.Symbol(name="name1", payload=4, uuid=id4)),
                3:
                gtirb.SymStackConst(
                    4, gtirb.Symbol(name="name2", payload=8, uuid=id5)),
            },
            uuid=id1,
        )
        self.assertTrue(b1.deep_eq(b2))

        b2 = gtirb.ByteInterval(
            address=None,
            contents=b"abcd",
            size=4,
            initialized_size=4,
            blocks=(
                gtirb.DataBlock(size=1, offset=3, uuid=id2),
                gtirb.CodeBlock(size=1, decode_mode=2, offset=3, uuid=id3),
            ),
            symbolic_expressions={
                2:
                gtirb.SymAddrConst(
                    3, gtirb.Symbol(name="name1", payload=4, uuid=id4)),
                3:
                gtirb.SymStackConst(
                    4, gtirb.Symbol(name="name2", payload=8, uuid=id5)),
            },
            uuid=id1,
        )
        self.assertFalse(b1.deep_eq(b2))

        b2 = gtirb.ByteInterval(
            address=1,
            contents=b"1234",
            size=4,
            initialized_size=4,
            blocks=(
                gtirb.DataBlock(size=1, offset=3, uuid=id2),
                gtirb.CodeBlock(size=1, decode_mode=2, offset=3, uuid=id3),
            ),
            symbolic_expressions={
                2:
                gtirb.SymAddrConst(
                    3, gtirb.Symbol(name="name1", payload=4, uuid=id4)),
                3:
                gtirb.SymStackConst(
                    4, gtirb.Symbol(name="name2", payload=8, uuid=id5)),
            },
            uuid=id1,
        )
        self.assertFalse(b1.deep_eq(b2))

        b2 = gtirb.ByteInterval(
            address=1,
            contents=b"abcd",
            size=8,
            initialized_size=4,
            blocks=(
                gtirb.DataBlock(size=1, offset=3, uuid=id2),
                gtirb.CodeBlock(size=1, decode_mode=2, offset=3, uuid=id3),
            ),
            symbolic_expressions={
                2:
                gtirb.SymAddrConst(
                    3, gtirb.Symbol(name="name1", payload=4, uuid=id4)),
                3:
                gtirb.SymStackConst(
                    4, gtirb.Symbol(name="name2", payload=8, uuid=id5)),
            },
            uuid=id1,
        )
        self.assertFalse(b1.deep_eq(b2))

        b2 = gtirb.ByteInterval(
            address=1,
            contents=b"abcd",
            size=4,
            initialized_size=0,
            blocks=(
                gtirb.DataBlock(size=1, offset=3, uuid=id2),
                gtirb.CodeBlock(size=1, decode_mode=2, offset=3, uuid=id3),
            ),
            symbolic_expressions={
                2:
                gtirb.SymAddrConst(
                    3, gtirb.Symbol(name="name1", payload=4, uuid=id4)),
                3:
                gtirb.SymStackConst(
                    4, gtirb.Symbol(name="name2", payload=8, uuid=id5)),
            },
            uuid=id1,
        )
        self.assertFalse(b1.deep_eq(b2))

        b2 = gtirb.ByteInterval(
            address=1,
            contents=b"abcd",
            size=4,
            initialized_size=4,
            blocks=(
                gtirb.DataBlock(size=1, offset=3, uuid=id2),
                gtirb.CodeBlock(size=1, decode_mode=5, offset=3, uuid=id3),
            ),
            symbolic_expressions={
                2:
                gtirb.SymAddrConst(
                    3, gtirb.Symbol(name="name1", payload=4, uuid=id4)),
                3:
                gtirb.SymStackConst(
                    4, gtirb.Symbol(name="name2", payload=8, uuid=id5)),
            },
            uuid=id1,
        )
        self.assertFalse(b1.deep_eq(b2))

        b2 = gtirb.ByteInterval(
            address=1,
            contents=b"abcd",
            size=4,
            initialized_size=4,
            blocks=(gtirb.CodeBlock(size=1, decode_mode=2, offset=3,
                                    uuid=id3), ),
            symbolic_expressions={
                2:
                gtirb.SymAddrConst(
                    3, gtirb.Symbol(name="name1", payload=4, uuid=id4)),
                3:
                gtirb.SymStackConst(
                    4, gtirb.Symbol(name="name2", payload=8, uuid=id5)),
            },
            uuid=id1,
        )
        self.assertFalse(b1.deep_eq(b2))

        b2 = gtirb.ByteInterval(
            address=1,
            contents=b"abcd",
            size=4,
            initialized_size=4,
            blocks=(
                gtirb.DataBlock(size=1, offset=3, uuid=id2),
                gtirb.CodeBlock(size=1, decode_mode=2, offset=3, uuid=id3),
            ),
            symbolic_expressions={
                2:
                gtirb.SymAddrConst(
                    6, gtirb.Symbol(name="name1", payload=4, uuid=id4)),
                3:
                gtirb.SymStackConst(
                    4, gtirb.Symbol(name="name2", payload=8, uuid=id5)),
            },
            uuid=id1,
        )
        self.assertFalse(b1.deep_eq(b2))

        b2 = gtirb.ByteInterval(
            address=1,
            contents=b"abcd",
            size=4,
            initialized_size=4,
            blocks=(
                gtirb.DataBlock(size=1, offset=3, uuid=id2),
                gtirb.CodeBlock(size=1, decode_mode=2, offset=3, uuid=id3),
            ),
            symbolic_expressions={
                2:
                gtirb.SymAddrConst(
                    3, gtirb.Symbol(name="name1", payload=4, uuid=id4))
            },
            uuid=id1,
        )
        self.assertFalse(b1.deep_eq(b2))

        b2 = gtirb.ByteInterval(
            address=1,
            contents=b"abcd",
            size=4,
            initialized_size=4,
            blocks=(
                gtirb.DataBlock(size=1, offset=3, uuid=id2),
                gtirb.CodeBlock(size=1, decode_mode=2, offset=3, uuid=id3),
            ),
            symbolic_expressions={
                7:
                gtirb.SymAddrConst(
                    3, gtirb.Symbol(name="name1", payload=4, uuid=id4)),
                8:
                gtirb.SymStackConst(
                    4, gtirb.Symbol(name="name2", payload=8, uuid=id5)),
            },
            uuid=id1,
        )
        self.assertFalse(b1.deep_eq(b2))

        b2 = gtirb.ByteInterval(
            address=1,
            contents=b"abcd",
            size=4,
            initialized_size=4,
            blocks=(
                gtirb.DataBlock(size=1, offset=3, uuid=id2),
                gtirb.CodeBlock(size=1, decode_mode=2, offset=3, uuid=id3),
            ),
            symbolic_expressions={
                2:
                gtirb.SymAddrConst(
                    3, gtirb.Symbol(name="name1", payload=4, uuid=id4)),
                3:
                gtirb.SymStackConst(
                    4, gtirb.Symbol(name="name2", payload=8, uuid=id5)),
            },
            uuid=id6,
        )
        self.assertFalse(b1.deep_eq(b2))