PyPI / pyparsing / 3.3.3

pyparsing 3.3.3

Source
https://github.com/pyparsing/pyparsing
Tag scanned
3.3.3
Compared with
3.3.2 (0 signals introduced since)
Files
219 scanned, 62 skipped (binary, oversized, or unrecognised)
Signals
0 critical · 0 warn · 91 info
Scan time
17.3 s
LLM review
Reviewed by claude-haiku-5-5 (Anthropic): 27 of 27 warn and critical signals; 27 demoted to info.
Disclude version
4.1.0
Scanned (UTC)
2026-10-22 00:47

Signals

Ordered by severity, then signals introduced in this release. Hidden characters are shown as ⟨U+…⟩.

  1. info warn → info by review unicode-homoglyph docs/HowToUsePyparsing.rst:1430:35

    identifier `Καλημέρα` contains homoglyph candidates: Κ (039A)→K, α (03B1)→a, η (03B7)→n, ρ (03C1)→p (raw pass, confidence 0.70)

        greek_word = pp.Word(ppu.Greek.alphas)
        greek_word[...].parse_string("Καλημέρα κόσμε")
    
    The following language ranges are defined.
    likely benign LLM, confidence 0.90 Greek sample word inside a pyparsing docs example.
    Reasoning

    Greek text in a documentation example demonstrating Unicode parsing; homoglyph flag is a false positive because the identifier is a Greek string literal, not a code identifier spoofing Latin.

  2. info warn → info by review unicode-mixed-script docs/HowToUsePyparsing.rst:1430:35

    identifier `Καλημέρα` mixes scripts: Greek + Latin (raw pass, confidence 0.80)

        greek_word = pp.Word(ppu.Greek.alphas)
        greek_word[...].parse_string("Καλημέρα κόσμε")
    
    The following language ranges are defined.
    likely benign LLM, confidence 0.90 Greek text sample in pyparsing documentation.
    Reasoning

    The string is intentionally multilingual text in a parsing documentation example; mixed-script detection here is a false positive from string content.

  3. info warn → info by review unicode-homoglyph docs/HowToUsePyparsing.rst:1430:52

    identifier `κόσμε` contains homoglyph candidates: κ (03BA)→k (raw pass, confidence 0.70)

        greek_word = pp.Word(ppu.Greek.alphas)
        greek_word[...].parse_string("Καλημέρα κόσμε")
    
    The following language ranges are defined.
    likely benign LLM, confidence 0.90 Greek sample word used as parser input in docs.
    Reasoning

    Greek word in a parse_string demo string, not an identifier; no deceptive intent.

  4. info warn → info by review unicode-mixed-script docs/HowToUsePyparsing.rst:1430:52

    identifier `κόσμε` mixes scripts: Greek + Latin (raw pass, confidence 0.80)

        greek_word = pp.Word(ppu.Greek.alphas)
        greek_word[...].parse_string("Καλημέρα κόσμε")
    
    The following language ranges are defined.
    likely benign LLM, confidence 0.90 Greek sample text in pyparsing docs.
    Reasoning

    Same documentation Greek sample; mixed-script flag reflects legitimate multilingual demo text.

  5. line length 602 characters (raw pass, confidence 0.50)

    <path d="M260.0 272h0.0" /><path d="M722.0 272h0.0" /><rect height="22" width="462" x="260" y="261"></rect><a xlink:href="#z-n-r-t-b-f-0011"><text x="491" y="276">&apos;n&apos; | &apos;r&apos; | &apos;t&apos; | &apos;b&apos; | &apos;f&apos; | &apos;\\&apos; | &apos;&quot;&apos; | &apos;>&apos; | &quot;&apos;&quot;</tex
  6. line length 602 characters (raw pass, confidence 0.50)

    <path d="M260.0 585h0.0" /><path d="M722.0 585h0.0" /><rect height="22" width="462" x="260" y="574"></rect><a xlink:href="#z-n-r-t-b-f-0011"><text x="491" y="589">&apos;n&apos; | &apos;r&apos; | &apos;t&apos; | &apos;b&apos; | &apos;f&apos; | &apos;\\&apos; | &apos;&quot;&apos; | &apos;>&apos; | &quot;&apos;&quot;</tex
  7. line length 602 characters (raw pass, confidence 0.50)

    <path d="M260.0 182h0.0" /><path d="M722.0 182h0.0" /><rect height="22" width="462" x="260" y="171"></rect><a xlink:href="#z-n-r-t-b-f-0011"><text x="491" y="186">&apos;n&apos; | &apos;r&apos; | &apos;t&apos; | &apos;b&apos; | &apos;f&apos; | &apos;\\&apos; | &apos;&quot;&apos; | &apos;>&apos; | &quot;&apos;&quot;</tex
  8. line length 602 characters (raw pass, confidence 0.50)

    <path d="M260.0 495h0.0" /><path d="M722.0 495h0.0" /><rect height="22" width="462" x="260" y="484"></rect><a xlink:href="#z-n-r-t-b-f-0011"><text x="491" y="499">&apos;n&apos; | &apos;r&apos; | &apos;t&apos; | &apos;b&apos; | &apos;f&apos; | &apos;\\&apos; | &apos;&quot;&apos; | &apos;>&apos; | &quot;&apos;&quot;</tex
  9. line length 615 characters (raw pass, confidence 0.50)

    <path d="M338.75 211h0.0" /><path d="M800.75 211h0.0" /><rect height="22" width="462" x="338.75" y="200"></rect><a xlink:href="#z-n-r-t-b-f-0011"><text x="569.75" y="215">&apos;n&apos; | &apos;r&apos; | &apos;t&apos; | &apos;b&apos; | &apos;f&apos; | &apos;\\&apos; | &apos;&quot;&apos; | &apos;>&apos; | &quot;&apos;&qu
  10. line length 615 characters (raw pass, confidence 0.50)

    <path d="M338.75 533h0.0" /><path d="M800.75 533h0.0" /><rect height="22" width="462" x="338.75" y="522"></rect><a xlink:href="#z-n-r-t-b-f-0011"><text x="569.75" y="537">&apos;n&apos; | &apos;r&apos; | &apos;t&apos; | &apos;b&apos; | &apos;f&apos; | &apos;\\&apos; | &apos;&quot;&apos; | &apos;>&apos; | &quot;&apos;&qu
  11. line length 525 characters (raw pass, confidence 0.50)

    <path d="M496.0 1276h0.0" /><path d="M643.5 1276h0.0" /><rect height="22" width="147.5" x="496" y="1265"></rect><a xlink:href="#z-0065"><text x="569.75" y="1280">&apos;?&apos; | &apos;*&apos; | &apos;+&apos;</text><text x="569.75" y="1280">&apos;?&apos; | &apos;*&apos; | &apos;+&apos;</text></a></g><path d="M643.5 1276
  12. line length 609 characters (raw pass, confidence 0.50)

    <path d="M240.0 1378h0.0" /><path d="M702.0 1378h0.0" /><rect height="22" width="462" x="240" y="1367"></rect><a xlink:href="#z-n-r-t-b-f-0011"><text x="471" y="1382">&apos;n&apos; | &apos;r&apos; | &apos;t&apos; | &apos;b&apos; | &apos;f&apos; | &apos;\\&apos; | &apos;&quot;&apos; | &apos;>&apos; | &quot;&apos;&quot;<
  13. line length 609 characters (raw pass, confidence 0.50)

    <path d="M240.0 1700h0.0" /><path d="M702.0 1700h0.0" /><rect height="22" width="462" x="240" y="1689"></rect><a xlink:href="#z-n-r-t-b-f-0011"><text x="471" y="1704">&apos;n&apos; | &apos;r&apos; | &apos;t&apos; | &apos;b&apos; | &apos;f&apos; | &apos;\\&apos; | &apos;&quot;&apos; | &apos;>&apos; | &quot;&apos;&quot;<
  14. line length 592 characters (raw pass, confidence 0.50)

    <path d="M80.0 71h0.0" /><path d="M542.0 71h0.0" /><rect height="22" width="462" x="80" y="60"></rect><a xlink:href="#z-n-r-t-b-f-0011"><text x="311" y="75">&apos;n&apos; | &apos;r&apos; | &apos;t&apos; | &apos;b&apos; | &apos;f&apos; | &apos;\\&apos; | &apos;&quot;&apos; | &apos;>&apos; | &quot;&apos;&quot;</text><tex
  15. line length 595 characters (raw pass, confidence 0.50)

    <path d="M194.0 95h0.0" /><path d="M656.0 95h0.0" /><rect height="22" width="462" x="194" y="84"></rect><a xlink:href="#z-n-r-t-b-f-0011"><text x="425" y="99">&apos;n&apos; | &apos;r&apos; | &apos;t&apos; | &apos;b&apos; | &apos;f&apos; | &apos;\\&apos; | &apos;&quot;&apos; | &apos;>&apos; | &quot;&apos;&quot;</text><t
  16. info critical → info by review dynamic-execution examples/cuneiform_python.py:104:1

    `exec` at module scope (runs on import) on a non-literal expression (ast pass, confidence 0.80)

    print("# run transformed Python")
    exec(transformed)
    likely benign LLM, confidence 0.80 Example script executing transformed Python code at module scope.
    Reasoning

    This is a transpiler example that executes code it just generated from a source-to-source transformation; exec of a generated string is expected in a demo, though it runs on import, which is a notable pattern for an example.

  17. info warn → info by review dynamic-execution examples/dfmparse.py:33:38

    `eval` called on a non-literal expression (ast pass, confidence 0.70)

        """chr(x) if 0 < x < 128 ; unicode(x) if x > 127."""⟨U+000D⟩
        return 0 < x < 128 and chr(x) or eval("u'\\u%d'" % x)
    likely benign LLM, confidence 0.80 eval used to build a unicode character from an integer.
    Reasoning

    eval on a constructed unicode escape string for a Delphi DFM parser helper; it is a formatted integer, so low risk, though eval is unnecessary.

  18. info warn → info by review encoding-octal examples/dhcpd_leases_parser.py:27:8

    7 consecutive `\NNN` octal escapes (entropy 2.8 bits/byte) (raw pass, confidence 0.65)

      hardware ethernet 00:17:f2:9b:d8:19;⟨U+000D⟩
      uid "\001\000\027\362\233\330\031";⟨U+000D⟩
    }⟨U+000D⟩
    lease 192.168.0.198 {
    likely benign LLM, confidence 0.90 Sample DHCP lease file containing binary uid octal escapes.
    Reasoning

    Octal escapes are binary DHCP lease data (uid field) embedded in sample text for a parser example; not obfuscation.

  19. info warn → info by review dynamic-attribute examples/ebnf.py:154:12

    reach-by-name through `vars` (ast pass, confidence 0.60)

    for name in all_names:⟨U+000D⟩
        expr = vars()[name]⟨U+000D⟩
        action = vars()["do_" + name]⟨U+000D⟩
        expr.set_name(name)
    likely benign LLM, confidence 0.90 Reflective lookup of grammar elements via vars() in an example.
    Reasoning

    Looking up grammar expressions and parse actions by name from locals in an example EBNF parser; a common pyparsing idiom with no external input reaching it.

  20. info warn → info by review dynamic-attribute examples/ebnf.py:155:14

    reach-by-name through `vars` (ast pass, confidence 0.60)

        expr = vars()[name]⟨U+000D⟩
        action = vars()["do_" + name]⟨U+000D⟩
        expr.set_name(name)⟨U+000D⟩
        expr.add_parse_action(action)
    likely benign LLM, confidence 0.90 Reflective attachment of parse actions by name.
    Reasoning

    Same vars()-based name lookup of parse actions in a grammar example; benign reflection.

  21. info critical → info by review dynamic-execution examples/eval_arith.py:251:27

    `eval` at module scope (runs on import) on a non-literal expression (ast pass, confidence 0.80)

        t = t.replace("<>", "!=")
        tests.append((t_orig, eval(t, vars_)))
    
    # copy vars_ to EvalConstant lookup dict
    likely benign LLM, confidence 0.80 eval of test expressions for an arithmetic parser demo.
    Reasoning

    eval of test expressions in an arithmetic evaluator example, with a fixed test list; not attacker-controlled input in this context.

  22. info unicode-homoglyph examples/greetingInGreek.py:15:10

    identifier `Καλημέρα` contains homoglyph candidates: Κ (039A)→K, α (03B1)→a, η (03B7)→n, ρ (03C1)→p (in string/comment) (raw pass, confidence 0.35)

    # input string⟨U+000D⟩
    hello = "Καλημέρα, κόσμε!"⟨U+000D⟩
    ⟨U+000D⟩
    # parse input string
  23. info unicode-mixed-script examples/greetingInGreek.py:15:10

    identifier `Καλημέρα` mixes scripts: Greek + Latin (in string/comment) (raw pass, confidence 0.40)

    # input string⟨U+000D⟩
    hello = "Καλημέρα, κόσμε!"⟨U+000D⟩
    ⟨U+000D⟩
    # parse input string
  24. info unicode-homoglyph examples/greetingInGreek.py:15:28

    identifier `κόσμε` contains homoglyph candidates: κ (03BA)→k (in string/comment) (raw pass, confidence 0.35)

    # input string⟨U+000D⟩
    hello = "Καλημέρα, κόσμε!"⟨U+000D⟩
    ⟨U+000D⟩
    # parse input string
  25. info unicode-mixed-script examples/greetingInGreek.py:15:28

    identifier `κόσμε` mixes scripts: Greek + Latin (in string/comment) (raw pass, confidence 0.40)

    # input string⟨U+000D⟩
    hello = "Καλημέρα, κόσμε!"⟨U+000D⟩
    ⟨U+000D⟩
    # parse input string
  26. line length 532 characters (raw pass, confidence 0.50)

    <path d="M593.5 47h0.0" /><path d="M1021.5 47h0.0" /><rect height="22" width="428" x="593.5" y="36"></rect><a xlink:href="#z-operations-0045"><text x="807.5" y="51">&apos;&lt;=&apos; | &apos;&lt;&apos; | &apos;>=&apos; | &apos;>&apos; | &apos;~=&apos; | &apos;==&apos; operations</text><text x="807.5" y="51">&apos;&lt;=
  27. line length 563 characters (raw pass, confidence 0.50)

    <path d="M1071.5 47h10.0" /><path d="M1509.5 47h10.0" /><rect height="22" width="428" x="1081.5" y="36"></rect><a xlink:href="#z-operations-0045"><text x="1295.5" y="51">&apos;&lt;=&apos; | &apos;&lt;&apos; | &apos;>=&apos; | &apos;>&apos; | &apos;~=&apos; | &apos;==&apos; operations</text><text x="1295.5" y="51">&apos
  28. line length 515 characters (raw pass, confidence 0.50)

    <path d="M191.0 56h0.0" /><path d="M525.5 56h0.0" /><rect height="22" width="334.5" x="191" y="45"></rect><a xlink:href="#z-not-in-like-operations-0005"><text x="358.25" y="60">{&apos;not&apos; ~{{&apos;in&apos; | &apos;like&apos;}}} operations</text><text x="358.25" y="60">{&apos;not&apos; ~{{&apos;in&apos; | &apos;li
  29. info warn → info by review dynamic-attribute examples/oc.py:147:9

    reach-by-name through `vars` (ast pass, confidence 0.60)

    ):⟨U+000D⟩
        v = vars()[vname]⟨U+000D⟩
        v.set_name(vname)
    likely benign LLM, confidence 0.90 Name-based lookup of grammar elements in an example script.
    Reasoning

    vars() lookup of locally defined grammar names in an example; benign reflection pattern.

  30. info critical → info by review dynamic-execution examples/protobuf_parser.py:33:5

    `exec` at module scope (runs on import) on a non-literal expression (ast pass, confidence 0.80)

    for kw in kwds.split():
        exec("{}_ = Keyword('{}')".format(kw.upper(), kw))
    
    messageBody = Forward()
    likely benign LLM, confidence 0.85 exec used to generate keyword variable definitions.
    Reasoning

    exec defining keyword variables from a fixed keyword list in a parser example; code generation from trusted static strings.

  31. line length 541 characters (raw pass, confidence 0.50)

    <path d="M1676.0 125h0.0" /><path d="M1721.5 125h0.0" /><rect height="22" width="45.5" x="1676" y="114"></rect><a xlink:href="#one-0013"><text x="1698.75" y="129">one</text><text x="1698.75" y="129">one</text></a></g><path d="M1721.5 125h20" /></g></g><path d="M1741.5 125h20" /></g></g><path d="M1761.5 125h20" /></g></
  32. info warn → info by review encoding-base64 examples/sexpParser.py:110:13

    base64-like blob (60 bytes, compression ratio 1.18) (raw pass, confidence 0.60)

            (e 15 |NFGq/E3wh9f4rJIQVXhS|)
            (n |d738/4ghP9rFZ0gAIYZ5q9y6iskDJwASi5rEQpEQq8ZyMZeIZzIAR2I5iGE=|))
           aid-committee))
         (subject
    likely benign LLM, confidence 0.90 Sample S-expression containing encoded key material.
    Reasoning

    Base64-like text is an S-expression cryptographic key sample (RSA public key values) in a parser test; expected data.

  33. info warn → info by review encoding-base64 examples/sexpParser.py:117:13

    base64-like blob (60 bytes, compression ratio 1.18) (raw pass, confidence 0.60)

            (e |NFGq/E3wh9f4rJIQVXhS|)
            (n |d738/4ghP9rFZ0gAIYZ5q9y6iskDJwASi5rEQpEQq8ZyMZeIZzIAR2I5iGE=|))
           tom
           mother))
    likely benign LLM, confidence 0.90 Sample S-expression with encoded key values.
    Reasoning

    Same sample S-expression key data in the parser example; expected content.

  34. info warn → info by review dynamic-execution examples/simpleBool.py:28:22

    `eval` called on a non-literal expression (ast pass, confidence 0.70)

            self.label = t[0]⟨U+000D⟩
            self.value = eval(t[0])⟨U+000D⟩
    ⟨U+000D⟩
        def __bool__(self) -> bool:
    likely benign LLM, confidence 0.85 eval of parsed boolean token in an example.
    Reasoning

    eval on the parsed token of a boolean expression example; grammar-restricted input in a demo, low risk here.

  35. info warn → info by review dynamic-execution examples/statemachine/statemachine.py:364:19

    `compile` called on a non-literal expression (ast pass, confidence 0.70)

    
            codeobj = compile(generated_code.rstrip(" \t"), module.__file__, COMPILE_MODE)
    
            exec(codeobj, module.__dict__)
    likely benign LLM, confidence 0.85 Compiles generated state machine module code.
    Reasoning

    compile of generated state machine code from the library's own code generator; legitimate code generation feature of statemachine.

  36. info warn → info by review dynamic-execution examples/statemachine/statemachine.py:366:9

    `exec` called on a non-literal expression (ast pass, confidence 0.70)

    
            exec(codeobj, module.__dict__)
    likely benign LLM, confidence 0.85 Executes generated state machine module code.
    Reasoning

    Executes the compiled code object into the generated module namespace, the expected behavior of the statemachine code generator.

  37. info critical → info by review dynamic-execution examples/statemachine/vending_machine.py:30:1

    `exec` at module scope (runs on import) on a non-literal expression (ast pass, confidence 0.80)

    # exec generated code to define state classes and state mixin
    exec(generated)
    likely benign LLM, confidence 0.80 Example state machine uses exec to define generated state classes at import.
    Reasoning

    Module-scope exec of generated code in an example state-machine library is a code-generation pattern; the code is generated locally, not an obfuscated payload. Still, exec on a non-literal at import time is a risky pattern worth noting.

  38. info unicode-homoglyph examples/tag_metadata.py:38:16

    identifier `κόσμος` contains homoglyph candidates: κ (03BA)→k, ο (03BF)→o (in string/comment) (raw pass, confidence 0.35)

            Hello, World!
            Hello, κόσμος?
            Hello, 世界!
            """
  39. info unicode-mixed-script examples/tag_metadata.py:38:16

    identifier `κόσμος` mixes scripts: Greek + Latin (in string/comment) (raw pass, confidence 0.40)

            Hello, World!
            Hello, κόσμος?
            Hello, 世界!
            """
  40. info warn → info by review unicode-mixed-script examples/tag_metadata_diagram.html:38:157

    identifier `〵〻〼ぁ` mixes scripts: Other + Hiragana (raw pass, confidence 0.80)

    <path d="M80.0 131h0.0" /><path d="M270.0 131h0.0" /><rect height="22" rx="10" ry="10" width="190" x="80" y="120"></rect><text x="175" y="135">W:(々〆〱-〵〻〼ぁ-ゖゝ-ゟ...)</text></g><path d="M270.0 131h10" /><path d="M280.0 131h10" /><g class="terminal ">
    dismissed LLM, confidence 0.85 SVG diagram label contains Japanese character-class notation flagged as mixed script.
    Reasoning

    Mixed-script identifier warning comes from a railroad diagram text label containing CJK iteration marks and Hiragana in a character-range description string, not an identifier; a rendering artifact of documentation content.

  41. line length 558 characters (raw pass, confidence 0.50)

    <path d="M50.0 31h0.0" /><path d="M469.5 31h0.0" /><rect height="22" width="419.5" x="50" y="20"></rect><a xlink:href="#z-operations-0022"><text x="259.75" y="35">&apos;&lt;>&apos; | &apos;&lt;=&apos; | &apos;&lt;&apos; | &apos;>=&apos; | &apos;>&apos; | &apos;=&apos; operations</text><text x="259.75" y="35">&apos;&lt;
  42. line length 558 characters (raw pass, confidence 0.50)

    <path d="M50.0 31h0.0" /><path d="M469.5 31h0.0" /><rect height="22" width="419.5" x="50" y="20"></rect><a xlink:href="#z-operations-0021"><text x="259.75" y="35">&apos;&lt;>&apos; | &apos;&lt;=&apos; | &apos;&lt;&apos; | &apos;>=&apos; | &apos;>&apos; | &apos;=&apos; operations</text><text x="259.75" y="35">&apos;&lt;
  43. info unicode-mixed-script examples/unicode_denormalizer.py:54:28

    identifier `ffl` mixes scripts: Other + Latin (in string/comment) (raw pass, confidence 0.40)

        'XI': ('Ⅺ', 'Ⅺ', 'XI'),
        'ffl': ('ffl', 'ffl', 'ffl', 'ffl', 'ffl'),
        'ffi': ('ffi', 'ffi', 'ffi', 'ffi', 'ffi'),
        'ff': ('ff', 'ff', 'ff'),
  44. info unicode-mixed-script examples/unicode_denormalizer.py:54:36

    identifier `ffl` mixes scripts: Latin + Other (in string/comment) (raw pass, confidence 0.40)

        'XI': ('Ⅺ', 'Ⅺ', 'XI'),
        'ffl': ('ffl', 'ffl', 'ffl', 'ffl', 'ffl'),
        'ffi': ('ffi', 'ffi', 'ffi', 'ffi', 'ffi'),
        'ff': ('ff', 'ff', 'ff'),
  45. info unicode-mixed-script examples/unicode_denormalizer.py:55:28

    identifier `ffi` mixes scripts: Other + Latin (in string/comment) (raw pass, confidence 0.40)

        'ffl': ('ffl', 'ffl', 'ffl', 'ffl', 'ffl'),
        'ffi': ('ffi', 'ffi', 'ffi', 'ffi', 'ffi'),
        'ff': ('ff', 'ff', 'ff'),
        'fi': ('fi', 'fi', 'fi'),
  46. info unicode-mixed-script examples/unicode_denormalizer.py:55:36

    identifier `ffi` mixes scripts: Latin + Other (in string/comment) (raw pass, confidence 0.40)

        'ffl': ('ffl', 'ffl', 'ffl', 'ffl', 'ffl'),
        'ffi': ('ffi', 'ffi', 'ffi', 'ffi', 'ffi'),
        'ff': ('ff', 'ff', 'ff'),
        'fi': ('fi', 'fi', 'fi'),
  47. info warn → info by review dynamic-execution examples/unicode_denormalizer.py:148:12

    `compile` called on a non-literal expression (ast pass, confidence 0.70)

        # does it really work? compile the transformed code and run it!
        code = compile(transformed, "inline source", mode="exec")
        exec(code)
    likely benign LLM, confidence 0.85 Demo script compiles and executes its transformed code as a self-check.
    Reasoning

    The file is a unicode denormalizer example that deliberately compiles and runs transformed source to test itself. The exec is of a locally produced, self-test string in an example demonstrating the tool's own transform, consistent with a legitimate demo.

  48. info warn → info by review dynamic-execution examples/unicode_denormalizer.py:149:5

    `exec` called on a non-literal expression (ast pass, confidence 0.70)

        code = compile(transformed, "inline source", mode="exec")
        exec(code)
    
        if 1:
    likely benign LLM, confidence 0.85 Demo script executes the compiled output of its own transform.
    Reasoning

    Same self-test pattern: exec of the compiled transformed code within an example script; the code is the script's own output, not external input.

  49. info critical → info by review dynamic-execution run_perf_all_tags.sh:96:5

    `eval` called on a dynamic (variable/substitution) expression (ast pass, confidence 0.90)

        # Using the Windows-style py launcher (rare on Ubuntu), invoke as: py -3.12 -m venv
        eval "$interp_cmd -m venv \"$VENV_DIR\"" || { echo "Failed to create venv for Python $pv, skipping..."; continue; }
      else
    likely benign LLM, confidence 0.80 Benchmark script evals a venv creation command built from interpreter variables.
    Reasoning

    eval of a constructed command string containing a variable interpreter command and venv path. The eval is used to create virtualenvs for different Python versions; the inputs are local script variables, so it is a common but unsafe shell idiom rather than malicious.

  50. info critical → info by review dynamic-execution run_perf_all_tags.sh:98:5

    command name is a variable (`$interp_cmd`) and `interp_cmd` is assigned the output of a command — executed command determined at runtime (ast pass, confidence 0.90)

      else
        "$interp_cmd" -m venv "$VENV_DIR" || { echo "Failed to create venv for Python $pv, skipping..."; continue; }
      fi
    likely benign LLM, confidence 0.80 Script runs a runtime-selected Python interpreter to create a venv.
    Reasoning

    Executing a variable command name assigned from detected interpreter output is a normal way to select among Python interpreters for venv creation. No download, decoding, or remote input is involved.

  51. info dynamic-execution run_perf_all_tags.sh:106:8

    command name is a variable (`$PYTHON`) that this file sets only to plain text (ast pass, confidence 0.40)

      echo "Upgrading pip and installing dependencies for Python $pv..."
      if ! "$PYTHON" -m pip install --upgrade pip setuptools wheel >/dev/null; then
        echo "Failed to upgrade pip for Python $pv, skipping this interpreter."
        continue
  52. info dynamic-execution run_perf_all_tags.sh:110:8

    command name is a variable (`$PIP`) that this file sets only to plain text (ast pass, confidence 0.40)

      fi
      if ! "$PIP" install littletable >/dev/null; then
        echo "Failed to install littletable for Python $pv, skipping this interpreter."
        continue
  53. info dynamic-execution run_perf_all_tags.sh:114:8

    command name is a variable (`$PIP`) that this file sets only to plain text (ast pass, confidence 0.40)

      fi
      if ! "$PIP" install rich >/dev/null; then
        echo "Failed to install rich for Python $pv, skipping this interpreter."
        continue
  54. info dynamic-execution run_perf_all_tags.sh:127:5

    command name is a variable (`$PIP`) that this file sets only to plain text (ast pass, confidence 0.40)

        echo "=== Running perf for Python $pv, pyparsing $v ==="
        "$PIP" uninstall -y pyparsing >/dev/null 2>&1 || true
        if ! "$PIP" install "pyparsing==$v"; then
          echo "Failed to install pyparsing $v on Python $pv, skipping..."
  55. info dynamic-execution run_perf_all_tags.sh:128:10

    command name is a variable (`$PIP`) that this file sets only to plain text (ast pass, confidence 0.40)

        "$PIP" uninstall -y pyparsing >/dev/null 2>&1 || true
        if ! "$PIP" install "pyparsing==$v"; then
          echo "Failed to install pyparsing $v on Python $pv, skipping..."
          continue
  56. info dynamic-execution run_perf_all_tags.sh:134:10

    command name is a variable (`$PYTHON`) that this file sets only to plain text (ast pass, confidence 0.40)

        export PYTHONUTF8=1
        if ! "$PYTHON" "$VENV_TMP/perf_pyparsing.py" --append-csv "$CSV"; then
          echo "perf run failed for pyparsing $v on Python $pv, continuing..."
          continue
  57. info unicode-homoglyph tests/test_unit.py:1852:16

    identifier `а` contains homoglyph candidates: а (0430)→a (in string/comment) (raw pass, confidence 0.35)

                r"[\x21]",
                r"[а-яА-ЯёЁA-Z$_\041α-ω]",
                r"[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xff]",
                r"[\0xa1-\0xbf\0xd7\0xf7]",
  58. info unicode-mixed-script tests/test_unit.py:1852:24

    identifier `ЯёЁA` mixes scripts: Cyrillic + Latin (in string/comment) (raw pass, confidence 0.40)

                r"[\x21]",
                r"[а-яА-ЯёЁA-Z$_\041α-ω]",
                r"[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xff]",
                r"[\0xa1-\0xbf\0xd7\0xf7]",
  59. info unicode-homoglyph tests/test_unit.py:1852:39

    identifier `α` contains homoglyph candidates: α (03B1)→a (in string/comment) (raw pass, confidence 0.35)

                r"[\x21]",
                r"[а-яА-ЯёЁA-Z$_\041α-ω]",
                r"[\0xc0-\0xd6\0xd8-\0xf6\0xf8-\0xff]",
                r"[\0xa1-\0xbf\0xd7\0xf7]",
  60. info unicode-zero-width tests/test_unit.py:1867:38

    U+00AD SOFT HYPHEN in source (in string/comment) (raw pass, confidence 0.45)

                "¡¢£¤¥¦§¨©ª«¬⟨U+00AD⟩®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþ",
                " !\"#$%&'()*+,-./0",
                "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
  61. info unicode-homoglyph tests/test_unit.py:1880:14

    identifier `абвгдежзийклмнопрстуфхцчшщъыьэюяАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯёЁABCDEFGHIJKLMNOPQRSTUVWXYZ` contains homoglyph candidates: а (0430)→a, е (0435)→e, о (043E)→o, р (0440)→p (in string/comment) (raw pass, confidence 0.35)

                "!",
                "абвгдежзийклмнопрстуфхцчшщъыьэюяАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯёЁABCDEFGHIJKLMNOPQRSTUVWXYZ$_!αβγδεζηθικλμνξοπρςστυφχψω",
  62. info unicode-mixed-script tests/test_unit.py:1880:14

    identifier `абвгдежзийклмнопрстуфхцчшщъыьэюяАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯёЁABCDEFGHIJKLMNOPQRSTUVWXYZ` mixes scripts: Cyrillic + Latin (in string/comment) (raw pass, confidence 0.40)

                "!",
                "абвгдежзийклмнопрстуфхцчшщъыьэюяАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯёЁABCDEFGHIJKLMNOPQRSTUVWXYZ$_!αβγδεζηθικλμνξοπρςστυφχψω",
  63. info unicode-homoglyph tests/test_unit.py:1880:175

    identifier `αβγδεζηθικλμνξοπρςστυφχψω` contains homoglyph candidates: α (03B1)→a, η (03B7)→n, κ (03BA)→k, ν (03BD)→v (in string/comment) (raw pass, confidence 0.35)

                "!",
                "абвгдежзийклмнопрстуфхцчшщъыьэюяАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯёЁABCDEFGHIJKLMNOPQRSTUVWXYZ$_!αβγδεζηθικλμνξοπρςστυφχψω",
  64. info unicode-mixed-script tests/test_unit.py:1880:175

    identifier `αβγδεζηθικλμνξοπρςστυφχψω` mixes scripts: Greek + Latin (in string/comment) (raw pass, confidence 0.40)

                "!",
                "абвгдежзийклмнопрстуфхцчшщъыьэюяАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯёЁABCDEFGHIJKLMNOPQRSTUVWXYZ$_!αβγδεζηθικλμνξοπρςστυφχψω",
  65. info warn → info by review decoder-import-with-exec tests/test_unit.py:2687:24

    file imports decoder module(s) pickle and calls `exec`/`eval`/`compile` — multi-stage payload shape (ast pass, confidence 0.80)

                print(t, "\n", res[0], "=", bool(res[0]), "\n")
                expected = eval(t, {}, boolVars)
                self.assertEqual(expected, bool(res[0]), f"failed boolean eval test {t}")
    likely benign LLM, confidence 0.80 Unit test evaluates boolean test expressions with a restricted namespace.
    Reasoning

    Test file for a boolean expression library evaluates test strings with eval using a restricted namespace. The pickle import reflects the library's own tests, not a multi-stage payload; the decoder-import heuristic is misfiring on test code.

  66. info warn → info by review dynamic-execution tests/test_unit.py:2687:24

    `eval` called on a non-literal expression (ast pass, confidence 0.70)

                print(t, "\n", res[0], "=", bool(res[0]), "\n")
                expected = eval(t, {}, boolVars)
                self.assertEqual(expected, bool(res[0]), f"failed boolean eval test {t}")
    likely benign LLM, confidence 0.80 Unit test uses eval on test-case expression strings.
    Reasoning

    eval of test expression strings in a unit test for a parsing library; the expressions are fixed test fixtures, so this is ordinary test harness behavior.

  67. info warn → info by review dynamic-execution tests/test_unit.py:2834:17

    `eval` called on a non-literal expression (ast pass, confidence 0.70)

                self.assertEqual(
                    eval(t),
                    eval_value,
                    f"Error evaluating {t!r}, expected {eval(t)!r}, got {eval_value!r}",
    likely benign LLM, confidence 0.85 Test assertion evaluates expression strings to compare results.
    Reasoning

    eval used in a test assertion to compare expected values for test expressions. Inputs are test fixtures within a test suite; typical of library testing.

  68. info warn → info by review dynamic-execution tests/test_unit.py:2836:53

    `eval` called on a non-literal expression (ast pass, confidence 0.70)

                    eval_value,
                    f"Error evaluating {t!r}, expected {eval(t)!r}, got {eval_value!r}",
                )
    likely benign LLM, confidence 0.85 Test assertion message evaluates expression strings.
    Reasoning

    Same test-harness eval used inside the assertion message; fixture-driven and benign.

  69. info unicode-homoglyph tests/test_unit.py:8737:18

    identifier `Καλημέρα` contains homoglyph candidates: Κ (039A)→K, α (03B1)→a, η (03B7)→n, ρ (03C1)→p (in string/comment) (raw pass, confidence 0.35)

            # input string
            hello = "Καλημέρα, κόσμε!"
            result = greet.parse_string(hello, parse_all=True)
            print(result)
  70. info unicode-mixed-script tests/test_unit.py:8737:18

    identifier `Καλημέρα` mixes scripts: Greek + Latin (in string/comment) (raw pass, confidence 0.40)

            # input string
            hello = "Καλημέρα, κόσμε!"
            result = greet.parse_string(hello, parse_all=True)
            print(result)
  71. info unicode-homoglyph tests/test_unit.py:8737:36

    identifier `κόσμε` contains homoglyph candidates: κ (03BA)→k (in string/comment) (raw pass, confidence 0.35)

            # input string
            hello = "Καλημέρα, κόσμε!"
            result = greet.parse_string(hello, parse_all=True)
            print(result)
  72. info unicode-mixed-script tests/test_unit.py:8737:36

    identifier `κόσμε` mixes scripts: Greek + Latin (in string/comment) (raw pass, confidence 0.40)

            # input string
            hello = "Καλημέρα, κόσμε!"
            result = greet.parse_string(hello, parse_all=True)
            print(result)
  73. info unicode-homoglyph tests/test_unit.py:8742:29

    identifier `Καλημέρα` contains homoglyph candidates: Κ (039A)→K, α (03B1)→a, η (03B7)→n, ρ (03C1)→p (in string/comment) (raw pass, confidence 0.35)

                result,
                expected_list=["Καλημέρα", ",", "κόσμε", "!"],
                msg="Failed to parse Greek 'Hello, World!' using "
                "pyparsing_unicode.Greek.alphas",
  74. info unicode-mixed-script tests/test_unit.py:8742:29

    identifier `Καλημέρα` mixes scripts: Greek + Latin (in string/comment) (raw pass, confidence 0.40)

                result,
                expected_list=["Καλημέρα", ",", "κόσμε", "!"],
                msg="Failed to parse Greek 'Hello, World!' using "
                "pyparsing_unicode.Greek.alphas",
  75. info unicode-homoglyph tests/test_unit.py:8742:54

    identifier `κόσμε` contains homoglyph candidates: κ (03BA)→k (in string/comment) (raw pass, confidence 0.35)

                result,
                expected_list=["Καλημέρα", ",", "κόσμε", "!"],
                msg="Failed to parse Greek 'Hello, World!' using "
                "pyparsing_unicode.Greek.alphas",
  76. info unicode-mixed-script tests/test_unit.py:8742:54

    identifier `κόσμε` mixes scripts: Greek + Latin (in string/comment) (raw pass, confidence 0.40)

                result,
                expected_list=["Καλημέρα", ",", "κόσμε", "!"],
                msg="Failed to parse Greek 'Hello, World!' using "
                "pyparsing_unicode.Greek.alphas",
  77. info unicode-homoglyph tests/test_unit.py:10412:22

    identifier `кириллицаx_10` contains homoglyph candidates: р (0440)→p, а (0430)→a (in string/comment) (raw pass, confidence 0.35)

            result = idents[...].parse_string(
                "abc_100 кириллицаx_10 日本語f_300 ไทยg_600 def_200 漢字y_300 한국어_中文c_400 Ελληνικάb_500",
                parse_all=True,
            )
  78. info unicode-mixed-script tests/test_unit.py:10412:22

    identifier `кириллицаx_10` mixes scripts: Cyrillic + Latin (in string/comment) (raw pass, confidence 0.40)

            result = idents[...].parse_string(
                "abc_100 кириллицаx_10 日本語f_300 ไทยg_600 def_200 漢字y_300 한국어_中文c_400 Ελληνικάb_500",
                parse_all=True,
            )
  79. info unicode-mixed-script tests/test_unit.py:10412:60

    identifier `ไทยg_600` mixes scripts: Other + Latin (in string/comment) (raw pass, confidence 0.40)

            result = idents[...].parse_string(
                "abc_100 кириллицаx_10 日本語f_300 ไทยg_600 def_200 漢字y_300 한국어_中文c_400 Ελληνικάb_500",
                parse_all=True,
            )
  80. info unicode-homoglyph tests/test_unit.py:10412:117

    identifier `Ελληνικάb_500` contains homoglyph candidates: Ε (0395)→E, η (03B7)→n, ν (03BD)→v, κ (03BA)→k (in string/comment) (raw pass, confidence 0.35)

            result = idents[...].parse_string(
                "abc_100 кириллицаx_10 日本語f_300 ไทยg_600 def_200 漢字y_300 한국어_中文c_400 Ελληνικάb_500",
                parse_all=True,
            )
  81. info unicode-mixed-script tests/test_unit.py:10412:117

    identifier `Ελληνικάb_500` mixes scripts: Greek + Latin (in string/comment) (raw pass, confidence 0.40)

            result = idents[...].parse_string(
                "abc_100 кириллицаx_10 日本語f_300 ไทยg_600 def_200 漢字y_300 한국어_中文c_400 Ελληνικάb_500",
                parse_all=True,
            )
  82. info unicode-homoglyph tests/test_unit.py:10419:18

    identifier `кириллицаx_10` contains homoglyph candidates: р (0440)→p, а (0430)→a (in string/comment) (raw pass, confidence 0.35)

                    "abc_100",
                    "кириллицаx_10",
                    "日本語f_300",
                    "ไทยg_600",
  83. info unicode-mixed-script tests/test_unit.py:10419:18

    identifier `кириллицаx_10` mixes scripts: Cyrillic + Latin (in string/comment) (raw pass, confidence 0.40)

                    "abc_100",
                    "кириллицаx_10",
                    "日本語f_300",
                    "ไทยg_600",
  84. info unicode-mixed-script tests/test_unit.py:10421:18

    identifier `ไทยg_600` mixes scripts: Other + Latin (in string/comment) (raw pass, confidence 0.40)

                    "日本語f_300",
                    "ไทยg_600",
                    "def_200",
                    "漢字y_300",
  85. info unicode-homoglyph tests/test_unit.py:10425:18

    identifier `Ελληνικάb_500` contains homoglyph candidates: Ε (0395)→E, η (03B7)→n, ν (03BD)→v, κ (03BA)→k (in string/comment) (raw pass, confidence 0.35)

                    "한국어_中文c_400",
                    "Ελληνικάb_500",
                ],
                {
  86. info unicode-mixed-script tests/test_unit.py:10425:18

    identifier `Ελληνικάb_500` mixes scripts: Greek + Latin (in string/comment) (raw pass, confidence 0.40)

                    "한국어_中文c_400",
                    "Ελληνικάb_500",
                ],
                {
  87. info unicode-homoglyph tests/test_unit.py:10429:31

    identifier `кириллицаx_10` contains homoglyph candidates: р (0440)→p, а (0430)→a (in string/comment) (raw pass, confidence 0.35)

                    "cjk": ["한국어_中文c_400"],
                    "cyrillic": ["кириллицаx_10"],
                    "greek": ["Ελληνικάb_500"],
                    "japanese": ["日本語f_300", "漢字y_300"],
  88. info unicode-mixed-script tests/test_unit.py:10429:31

    identifier `кириллицаx_10` mixes scripts: Cyrillic + Latin (in string/comment) (raw pass, confidence 0.40)

                    "cjk": ["한국어_中文c_400"],
                    "cyrillic": ["кириллицаx_10"],
                    "greek": ["Ελληνικάb_500"],
                    "japanese": ["日本語f_300", "漢字y_300"],
  89. info unicode-homoglyph tests/test_unit.py:10430:28

    identifier `Ελληνικάb_500` contains homoglyph candidates: Ε (0395)→E, η (03B7)→n, ν (03BD)→v, κ (03BA)→k (in string/comment) (raw pass, confidence 0.35)

                    "cyrillic": ["кириллицаx_10"],
                    "greek": ["Ελληνικάb_500"],
                    "japanese": ["日本語f_300", "漢字y_300"],
                    "latin": ["abc_100", "def_200"],
  90. info unicode-mixed-script tests/test_unit.py:10430:28

    identifier `Ελληνικάb_500` mixes scripts: Greek + Latin (in string/comment) (raw pass, confidence 0.40)

                    "cyrillic": ["кириллицаx_10"],
                    "greek": ["Ελληνικάb_500"],
                    "japanese": ["日本語f_300", "漢字y_300"],
                    "latin": ["abc_100", "def_200"],
  91. info unicode-mixed-script tests/test_unit.py:10433:27

    identifier `ไทยg_600` mixes scripts: Other + Latin (in string/comment) (raw pass, confidence 0.40)

                    "latin": ["abc_100", "def_200"],
                    "thai": ["ไทยg_600"],
                },
            )

Reproduce This Scan

Run disclude locally to verify. Add --format sarif for SARIF output. Add --llm (with an API key in the environment) to include the LLM review.

cargo install disclude --version 4.1.0
git clone https://github.com/pyparsing/pyparsing pyparsing && cd pyparsing
git checkout 3.3.3
disclude scan --severity info --diff 3.3.2 .