Skip to content

Two more un-anchored negation lookbehinds in check-pr-fully-clean.py swallow findings #3537

Description

@d-morrison

Problem

Two more sites carry the un-anchored lookbehind shape that #3497 fixed in _BARE_REJECTION:

  • scripts/check-pr-fully-clean.py:1664_FINDINGS_HEADING_NOT_EXEMPT
  • scripts/check-pr-fully-clean.py:1692_LINE_UNRESOLVED_WORDS

Both contain (?<!non-)(?<!non\s)\bblocking\b. Without a \b on the lookbehind, any longer word ending in those letters satisfies it, so the phrase after it is swallowed.

Why it matters

It is the swallowed-not-clean direction — the instrument reads a genuine finding as absent — which is the direction this file's own design notes repeatedly single out as the dangerous one.

Provenance

Surfaced by the round-5 adversarial review of #3497, which explicitly scoped it out: neither line is touched by that diff, so fixing them there would have widened a PR that had already been through five rounds. The same review confirmed the fix works at the site it does cover — "cannot blocking", "albino blocking", "piano-blocking" and "mono blocking" all stay flagged after \b anchoring.

Fix

Add \b inside each lookbehind, as #3497 did: (?<!\bnon-)(?<!\bnon\s).

Pin it the way #3497 pinned its own: construct an input for each site where a longer word ends in non, run it through the function that consumes the pattern rather than against the pattern itself, and confirm the test fails when the \b is removed. #3497's round-4 finding existed precisely because the tests asserted against a bare regex while the defect lived one layer up.

Check the rest of the file while you are there

These two were found by a reviewer looking at something else. A sweep for every lookbehind in the file — grep -n '(?<!' scripts/check-pr-fully-clean.py — would settle whether there are more, rather than waiting for the next one to surface the same way.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions