summaryrefslogtreecommitdiff
path: root/tests/analysis/disass/block.py
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2019-01-14 07:43:32 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2019-01-14 07:43:32 (GMT)
commita4fde950b940582a0e21a84c6c98a79f945fde02 (patch)
tree811f96acedac6812e01bb556773d52ac55312455 /tests/analysis/disass/block.py
parent20289d6a5d60d1bcf979ff7fdfc236486848d149 (diff)
Detected self loops in basic blocks.
Diffstat (limited to 'tests/analysis/disass/block.py')
-rw-r--r--tests/analysis/disass/block.py37
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)