diff options
| author | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2021-08-02 16:38:32 +0200 |
|---|---|---|
| committer | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2021-08-02 16:38:32 +0200 |
| commit | 171db6a594364b3f045a7a4a634ccf76c6786724 (patch) | |
| tree | 59549524de835034abf129884b1ed19d415f044f | |
| parent | 069440e8b4517a0ff93b94b4f89598e1695a429a (diff) | |
| download | miasm-171db6a594364b3f045a7a4a634ccf76c6786724.tar.gz miasm-171db6a594364b3f045a7a4a634ccf76c6786724.zip | |
Fix interfer computation
Diffstat (limited to '')
| -rw-r--r-- | miasm/analysis/data_flow.py | 19 |
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 |