Repository navigation
Description
A new codeanalyzer-python release (v1.5.4) is published.
Update the codeanalyzer-python pin in this repo and adapt the
integration to the changes below (see PyCodeanalyzer._run_analyzer).
[1.5.4] - 2026-09-16
Fixed
-
A parameter passed as an argument now links across the call boundary (#220). The SDG
edges were always correct --param_incarriedactual_in -> formal_inand the summary
edges were present -- but the DDG that feeds them was wired wrong on the way in.
Reaching-def analysis names the synthetic CFG ENTRY node as the definition site of every
parameter, capture and read global.build_formalsalready remapped that source onto the
matchingformal_invertex, which is what puts a parameter's definition on its port.
build_actualsruns after it, allocates theactual_inports, and wired them straight
from_defs_reaching_call_matching, which returns the raw source. For a parameter that
source is ENTRY, and nothing remapped it, so the graph gotENTRY -> actual_in:Nwhere it
neededformal_in:N -> actual_in:N. The return direction was wired correctly, and that
asymmetry is the tell.The consequence reached every interprocedural value query.
resolve_valuereturns the
formal_invertex, so a forward walk began at a vertex with no path to the argument port,
never crossedPARAM_IN, and stopped inside the caller.slice_forwardstayed in one
function,flows_to_callandflows_to_argumentansweredFalse,paths_betweenreturned
nothing, andtaint()reported a cleanexhaustedwithcomplete: Trueand an empty
ledger -- a refutation for a flow visible in three lines of source. Absence of evidence was
being published as evidence of absence.The ENTRY-to-
formal_inlookup is now aformal_for(var)helper on the assembler, used by
bothbuild_formalsandbuild_actuals, for argument ports and global-read ports alike. It
falls back to the original source when the variable is not one of the callable's formals, so
no edge is lost. On the reproducer in #220 a two-boundary flow now resolves end to end, and
taintreturns the witness instead of a refutation. A regression test in
test/test_dataflow_sdg.pyasserts that anactual_inport carrying a parameter is fed from
formal_inand never from ENTRY; it fails on 1.5.3.
Activity