diff options
Diffstat (limited to 'tests/analysis/disass/block.py')
-rw-r--r-- | tests/analysis/disass/block.py | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/tests/analysis/disass/block.py b/tests/analysis/disass/block.py index 1663150..84fa4c3 100644 --- a/tests/analysis/disass/block.py +++ b/tests/analysis/disass/block.py @@ -8,6 +8,7 @@ from chrysacase import ChrysalideTestCase from pychrysalide.analysis.contents import FileContent from pychrysalide.analysis import LoadedBinary +from pychrysalide.arch import ArchInstruction from pychrysalide.format.elf import ElfFormat import os import sys @@ -28,6 +29,8 @@ class TestBasicBlocks(ChrysalideTestCase): os.system('make -C %s hello > /dev/null 2>&1' % dirpath) + os.system('make -C %s irreducible > /dev/null 2>&1' % dirpath) + @classmethod def tearDownClass(cls): @@ -72,3 +75,38 @@ class TestBasicBlocks(ChrysalideTestCase): self.assertEqual(found.index, 0) self.assertEqual(found.rank, 0) + + + def testIrreducible(self): + """Validate support for irreducible loops.""" + + fullname = sys.modules[self.__class__.__module__].__file__ + filename = os.path.basename(fullname) + + baselen = len(fullname) - len(filename) + + cnt = FileContent(fullname[:baselen] + 'irreducible') + 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('argstr') + 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, 2) |