diff --git a/blocks/cflow/Int32Value.cs b/blocks/cflow/Int32Value.cs index 0908104e..ce2fc529 100644 --- a/blocks/cflow/Int32Value.cs +++ b/blocks/cflow/Int32Value.cs @@ -73,6 +73,10 @@ namespace de4dot.blocks.cflow { return hasValue(0); } + public bool isNonZero() { + return (value & validMask) != 0; + } + public bool hasValue(int value) { return allBitsValid() && this.value == value; } @@ -224,6 +228,8 @@ namespace de4dot.blocks.cflow { return createUnknown(); } } + if (ReferenceEquals(a, b) && a.isNonZero()) + return new Int32Value(1); if (b.hasValue(1)) return a; return createUnknown(); @@ -238,6 +244,8 @@ namespace de4dot.blocks.cflow { return createUnknown(); } } + if (ReferenceEquals(a, b) && a.isNonZero()) + return new Int32Value(1); if (b.hasValue(1)) return a; return createUnknown(); @@ -252,7 +260,7 @@ namespace de4dot.blocks.cflow { return createUnknown(); } } - if (b.hasValue(1)) + if ((ReferenceEquals(a, b) && a.isNonZero()) || b.hasValue(1)) return new Int32Value(0); return createUnknown(); } @@ -266,7 +274,7 @@ namespace de4dot.blocks.cflow { return createUnknown(); } } - if (b.hasValue(1)) + if ((ReferenceEquals(a, b) && a.isNonZero()) || b.hasValue(1)) return new Int32Value(0); return createUnknown(); } diff --git a/blocks/cflow/Int64Value.cs b/blocks/cflow/Int64Value.cs index e5aec69a..bf164943 100644 --- a/blocks/cflow/Int64Value.cs +++ b/blocks/cflow/Int64Value.cs @@ -61,6 +61,10 @@ namespace de4dot.blocks.cflow { return hasValue(0); } + public bool isNonZero() { + return ((ulong)value & validMask) != 0; + } + public bool hasValue(long value) { return allBitsValid() && this.value == value; } @@ -139,6 +143,8 @@ namespace de4dot.blocks.cflow { return createUnknown(); } } + if (ReferenceEquals(a, b) && a.isNonZero()) + return new Int64Value(1); if (b.hasValue(1)) return a; return createUnknown(); @@ -153,6 +159,8 @@ namespace de4dot.blocks.cflow { return createUnknown(); } } + if (ReferenceEquals(a, b) && a.isNonZero()) + return new Int64Value(1); if (b.hasValue(1)) return a; return createUnknown(); @@ -167,7 +175,7 @@ namespace de4dot.blocks.cflow { return createUnknown(); } } - if (b.hasValue(1)) + if ((ReferenceEquals(a, b) && a.isNonZero()) || b.hasValue(1)) return new Int64Value(0); return createUnknown(); } @@ -181,7 +189,7 @@ namespace de4dot.blocks.cflow { return createUnknown(); } } - if (b.hasValue(1)) + if ((ReferenceEquals(a, b) && a.isNonZero()) || b.hasValue(1)) return new Int64Value(0); return createUnknown(); }