about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorFabrice Desclaux <fabrice.desclaux@cea.fr>2021-08-02 16:38:32 +0200
committerFabrice Desclaux <fabrice.desclaux@cea.fr>2021-08-02 16:38:32 +0200
commit171db6a594364b3f045a7a4a634ccf76c6786724 (patch)
tree59549524de835034abf129884b1ed19d415f044f
parent069440e8b4517a0ff93b94b4f89598e1695a429a (diff)
downloadmiasm-171db6a594364b3f045a7a4a634ccf76c6786724.tar.gz
miasm-171db6a594364b3f045a7a4a634ccf76c6786724.zip
Fix interfer computation
Diffstat (limited to '')
-rw-r--r--miasm/analysis/data_flow.py19
1 files changed, 15 insertions, 4 deletions
diff --git a/miasm/analysis/data_flow.py b/miasm/analysis/data_flow.py
index 0a66447c..b22c4f83 100644
--- a/miasm/analysis/data_flow.py
+++ b/miasm/analysis/data_flow.py
@@ -1921,10 +1921,21 @@ class State(object):
                     base2, offset2 = get_expr_base_offset(src.ptr)
                     if base1 != base2:
                         return True
-                    assert offset1 + dst.size // 8 - 1 <= int(base1.mask)
-                    assert offset2 + src.size // 8 - 1 <= int(base2.mask)
-                    interval1 = interval([(offset1, offset1 + dst.size // 8 - 1)])
-                    interval2 = interval([(offset2, offset2 + src.size // 8 - 1)])
+                    size1 = dst.size // 8
+                    size2 = src.size // 8
+                    # Special case:
+                    # @32[ESP + 0xFFFFFFFE], @32[ESP]
+                    # Both memories alias
+                    if offset1 <= int(base1.mask) - size1:
+                        interval1 = interval([(offset1, offset1 + dst.size // 8 - 1)])
+                    else:
+                        interval1 = interval([(offset1, int(base1.mask))])
+                        interval1 += interval([(0, int(base1.mask) - offset1 )])
+                    if offset2 <= int(base2.mask) - size2:
+                        interval2 = interval([(offset2, offset2 + src.size // 8 - 1)])
+                    else:
+                        interval2 = interval([(offset2, int(base2.mask))])
+                        interval2 += interval([(0, int(base2.mask) - offset2 )])
                     if (interval1 & interval2).empty:
                         continue
                     return True