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 0b4f3dd..f8e6fe9 100644 --- a/tests/analysis/disass/block.py +++ b/tests/analysis/disass/block.py @@ -33,6 +33,8 @@ class TestBasicBlocks(ChrysalideTestCase): os.system('make -C %s selfloop > /dev/null 2>&1' % dirpath) + os.system('make -C %s evalcommand > /dev/null 2>&1' % dirpath) + @classmethod def tearDownClass(cls): @@ -147,3 +149,38 @@ class TestBasicBlocks(ChrysalideTestCase): loop_count += 1 self.assertEqual(loop_count, 1) + + + def testComplexLoopBlock(self): + """Validate support for complex loop blocks.""" + + fullname = sys.modules[self.__class__.__module__].__file__ + filename = os.path.basename(fullname) + + baselen = len(fullname) - len(filename) + + cnt = FileContent(fullname[:baselen] + 'evalcommand') + 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('evalcommand') + self.assertIsNotNone(sym) + + found = sym.basic_blocks.find_by_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, 3) |