diff options
Diffstat (limited to 'tests/analysis/disass/block.py')
-rw-r--r-- | tests/analysis/disass/block.py | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/tests/analysis/disass/block.py b/tests/analysis/disass/block.py index 84fa4c3..10a2c80 100644 --- a/tests/analysis/disass/block.py +++ b/tests/analysis/disass/block.py @@ -31,6 +31,8 @@ class TestBasicBlocks(ChrysalideTestCase): os.system('make -C %s irreducible > /dev/null 2>&1' % dirpath) + os.system('make -C %s selfloop > /dev/null 2>&1' % dirpath) + @classmethod def tearDownClass(cls): @@ -110,3 +112,38 @@ class TestBasicBlocks(ChrysalideTestCase): loop_count += 1 self.assertEqual(loop_count, 2) + + + def testSelfLoopBlock(self): + """Validate support for self loop blocks.""" + + fullname = sys.modules[self.__class__.__module__].__file__ + filename = os.path.basename(fullname) + + baselen = len(fullname) - len(filename) + + cnt = FileContent(fullname[:baselen] + 'selfloop') + self.assertIsNotNone(cnt) + + fmt = ElfFormat(cnt) + self.assertIsNotNone(fmt) + + binary = LoadedBinary(fmt) + self.assertIsNotNone(binary) + + binary.analyze_and_wait() + + sym = fmt.find_symbol_by_label('string_array_len') + self.assertIsNotNone(sym) + + found = sym.basic_blocks.find_by_starting_addr(sym.range.addr) + self.assertIsNotNone(found) + + loop_count = 0 + + for blk in sym.basic_blocks: + for _, dt in blk.destinations: + if dt == ArchInstruction.ILT_LOOP: + loop_count += 1 + + self.assertEqual(loop_count, 1) |