diff --git a/CHANGELOG.md b/CHANGELOG.md index ae10b1a2..c2562ab2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,8 @@ - fix lots of linter errors identified by pyright @williballenthin #3052 - fix: elf.py vdso_guess exception handler clobbers symtab_guess @williballenthin #3013 +- fix: _NoAddress.__eq__ unconditionally returns True @williballenthin #3014 + ### capa Explorer Web ### capa Explorer IDA Pro plugin diff --git a/capa/features/address.py b/capa/features/address.py index 86cd1e03..95e4ba64 100644 --- a/capa/features/address.py +++ b/capa/features/address.py @@ -184,7 +184,7 @@ class DNTokenOffsetAddress(Address): class _NoAddress(Address): def __eq__(self, other): - return True + return isinstance(other, _NoAddress) def __lt__(self, other): return False @@ -195,7 +195,7 @@ class _NoAddress(Address): return other is not self def __hash__(self): - return hash(0) + return hash(None) def __repr__(self): return "no address" diff --git a/tests/test_engine.py b/tests/test_engine.py index 0236cd93..3d5e0a6d 100644 --- a/tests/test_engine.py +++ b/tests/test_engine.py @@ -22,6 +22,30 @@ ADDR3 = capa.features.address.AbsoluteVirtualAddress(0x401003) ADDR4 = capa.features.address.AbsoluteVirtualAddress(0x401004) +def test_no_address_equality(): + no_addr = capa.features.address.NO_ADDRESS + addr_zero = capa.features.address.AbsoluteVirtualAddress(0) + + assert no_addr == no_addr + assert no_addr != addr_zero + assert addr_zero != no_addr + assert no_addr != ADDR1 + + +def test_no_address_hash(): + no_addr = capa.features.address.NO_ADDRESS + addr_zero = capa.features.address.AbsoluteVirtualAddress(0) + + assert hash(no_addr) != hash(addr_zero) + + s = {no_addr, addr_zero} + assert len(s) == 2 + + d = {no_addr: "no", addr_zero: "zero"} + assert d[no_addr] == "no" + assert d[addr_zero] == "zero" + + def test_number(): assert bool(Number(1).evaluate({Number(0): {ADDR1}})) is False assert bool(Number(1).evaluate({Number(1): {ADDR1}})) is True