fix: address Optional member access and type mismatch in tests (chunk 6)

- test_binexport_accessors.py: type: ignore on .expression accesses guarded by test assertions
- test_freeze_dynamic.py: assert isinstance DynamicFeatureExtractor before compare_extractors
- test_binja_features.py: type: ignore on binaryninja guarded by skipif decorator
This commit is contained in:
Willi Ballenthin
2026-04-22 17:18:08 +03:00
committed by Willi Ballenthin
parent 2b536e2f53
commit 89a365fa3d
3 changed files with 16 additions and 13 deletions

View File

@@ -523,18 +523,18 @@ def test_pattern_matching():
# 0x210184: ldrb w2, [x0, x1]
# query: ldrb reg0, [reg1(not-stack), reg2] ; capture reg2"
assert match_address(BE2_EXTRACTOR, queries, 0x210184).expression.symbol == "x1"
assert match_address_with_be2(BE2_EXTRACTOR, queries, 0x210184).expression.symbol == "x1"
assert match_address(BE2_EXTRACTOR, queries, 0x210184).expression.symbol == "x1" # type: ignore[union-attr] # test assertion; match returns non-None for these addresses
assert match_address_with_be2(BE2_EXTRACTOR, queries, 0x210184).expression.symbol == "x1" # type: ignore[union-attr] # test assertion; match returns non-None for these addresses
# 0x210198: mov x2, x1
# query: mov reg0, reg1 ; capture reg0"),
assert match_address(BE2_EXTRACTOR, queries, 0x210198).expression.symbol == "x2"
assert match_address_with_be2(BE2_EXTRACTOR, queries, 0x210198).expression.symbol == "x2"
assert match_address(BE2_EXTRACTOR, queries, 0x210198).expression.symbol == "x2" # type: ignore[union-attr] # test assertion; match returns non-None for these addresses
assert match_address_with_be2(BE2_EXTRACTOR, queries, 0x210198).expression.symbol == "x2" # type: ignore[union-attr] # test assertion; match returns non-None for these addresses
# 0x210190: add x1, x1, 0x1
# query: add reg, reg, #int ; capture #int
assert match_address(BE2_EXTRACTOR, queries, 0x210190).expression.immediate == 1
assert match_address_with_be2(BE2_EXTRACTOR, queries, 0x210190).expression.immediate == 1
assert match_address(BE2_EXTRACTOR, queries, 0x210190).expression.immediate == 1 # type: ignore[union-attr] # test assertion; match returns non-None for these addresses
assert match_address_with_be2(BE2_EXTRACTOR, queries, 0x210190).expression.immediate == 1 # type: ignore[union-attr] # test assertion; match returns non-None for these addresses
BE2_EXTRACTOR_687 = fixtures.get_binexport_extractor(
@@ -553,8 +553,8 @@ def test_pattern_matching_exclamation():
# note this captures the sp
# 0x107918: stp x20, x19, [sp,0xFFFFFFFFFFFFFFE0]!
# query: stp reg, reg, [reg, #int]! ; capture #int
assert match_address(BE2_EXTRACTOR_687, queries, 0x107918).expression.immediate == 0xFFFFFFFFFFFFFFE0
assert match_address_with_be2(BE2_EXTRACTOR_687, queries, 0x107918).expression.immediate == 0xFFFFFFFFFFFFFFE0
assert match_address(BE2_EXTRACTOR_687, queries, 0x107918).expression.immediate == 0xFFFFFFFFFFFFFFE0 # type: ignore[union-attr] # test assertion; match returns non-None for these addresses
assert match_address_with_be2(BE2_EXTRACTOR_687, queries, 0x107918).expression.immediate == 0xFFFFFFFFFFFFFFE0 # type: ignore[union-attr] # test assertion; match returns non-None for these addresses
def test_pattern_matching_stack():
@@ -566,8 +566,8 @@ def test_pattern_matching_stack():
# compare this with the test above (exclamation)
# 0x107918: stp x20, x19, [sp, 0xFFFFFFFFFFFFFFE0]!
# query: stp reg, reg, [reg(stack), #int]! ; capture #int
assert match_address(BE2_EXTRACTOR_687, queries, 0x107918).expression.immediate == 0xFFFFFFFFFFFFFFE0
assert match_address_with_be2(BE2_EXTRACTOR_687, queries, 0x107918).expression.immediate == 0xFFFFFFFFFFFFFFE0
assert match_address(BE2_EXTRACTOR_687, queries, 0x107918).expression.immediate == 0xFFFFFFFFFFFFFFE0 # type: ignore[union-attr] # test assertion; match returns non-None for these addresses
assert match_address_with_be2(BE2_EXTRACTOR_687, queries, 0x107918).expression.immediate == 0xFFFFFFFFFFFFFFE0 # type: ignore[union-attr] # test assertion; match returns non-None for these addresses
def test_pattern_matching_not_stack():
@@ -593,5 +593,5 @@ def test_pattern_matching_x86():
# 0x4018c0: LEA ECX, [EBX+0x2]
# query: cmp|lea reg, [reg(not-stack) + #int0] ; capture #int0
assert match_address(BE2_EXTRACTOR_MIMI, queries, 0x4018C0).expression.immediate == 2
assert match_address_with_be2(BE2_EXTRACTOR_MIMI, queries, 0x4018C0).expression.immediate == 2
assert match_address(BE2_EXTRACTOR_MIMI, queries, 0x4018C0).expression.immediate == 2 # type: ignore[union-attr] # test assertion; match returns non-None for these addresses
assert match_address_with_be2(BE2_EXTRACTOR_MIMI, queries, 0x4018C0).expression.immediate == 2 # type: ignore[union-attr] # test assertion; match returns non-None for these addresses

View File

@@ -69,5 +69,5 @@ def test_standalone_binja_backend():
@pytest.mark.skipif(binja_present is False, reason="Skip binja tests if the binaryninja Python API is not installed")
def test_binja_version():
version = binaryninja.core_version_info()
version = binaryninja.core_version_info() # type: ignore[possibly-undefined] # guarded by skipif binja_present
assert (version.major, version.minor) >= (5, 3)

View File

@@ -145,6 +145,7 @@ def test_freeze_str_roundtrip():
load = capa.features.freeze.loads
dump = capa.features.freeze.dumps
reanimated = load(dump(EXTRACTOR))
assert isinstance(reanimated, DynamicFeatureExtractor)
compare_extractors(EXTRACTOR, reanimated)
@@ -152,6 +153,7 @@ def test_freeze_bytes_roundtrip():
load = capa.features.freeze.load
dump = capa.features.freeze.dump
reanimated = load(dump(EXTRACTOR))
assert isinstance(reanimated, DynamicFeatureExtractor)
compare_extractors(EXTRACTOR, reanimated)
@@ -163,5 +165,6 @@ def test_freeze_load_sample(tmpdir):
Path(o.strpath).write_bytes(capa.features.freeze.dump(extractor))
null_extractor = capa.features.freeze.load(Path(o.strpath).read_bytes())
assert isinstance(null_extractor, DynamicFeatureExtractor)
compare_extractors(extractor, null_extractor)