PyPI / fonttools / 4.67.0

fonttools 4.67.0

Source
https://github.com/fonttools/fonttools
Artifact scanned
fonttools-4.67.0-py3-none-any.whl (wheel · 1.2 MB · SHA-256 4304f03ed7f4…)
Compared with
fonttools-4.66.1-py3-none-any.whl (0 signals introduced since)
Files
345 scanned, 7 skipped (binary, oversized, or unrecognised)
Signals
0 critical · 0 warn · 59 info
Scan time
23.2 s
LLM review
Reviewed by claude-haiku-5-5 (Anthropic): 27 of 27 warn and critical signals; 27 demoted to info.
Disclude version
4.3.0
Scanned (UTC)
2026-10-23 06:47

Signals

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

  1. info whitespace-anomaly fontTools/cffLib/__init__.py:18:1

    file mixes tab and space indentation (3 tab-indented and 3123 space-indented lines) (raw pass, confidence 0.40)

    from fontTools.misc.textTools import (
        bytechr,
        byteord,
        bytesjoin,
  2. info unicode-homoglyph fontTools/colorLib/geometry.py:26:14

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

    # The unit vector's X and Y components are respectively
    #   U = (cos(α), sin(α))
    # where α is the angle between the unit vector and the positive x axis.
    _UNIT_VECTOR_THRESHOLD = cos(3 / 8 * pi)  # == sin(1/8 * pi) == 0.38268343236508984
  3. info unicode-homoglyph fontTools/colorLib/geometry.py:26:23

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

    # The unit vector's X and Y components are respectively
    #   U = (cos(α), sin(α))
    # where α is the angle between the unit vector and the positive x axis.
    _UNIT_VECTOR_THRESHOLD = cos(3 / 8 * pi)  # == sin(1/8 * pi) == 0.38268343236508984
  4. info unicode-homoglyph fontTools/colorLib/geometry.py:27:9

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

    #   U = (cos(α), sin(α))
    # where α is the angle between the unit vector and the positive x axis.
    _UNIT_VECTOR_THRESHOLD = cos(3 / 8 * pi)  # == sin(1/8 * pi) == 0.38268343236508984
  5. info warn → info by review dynamic-attribute fontTools/cu2qu/benchmark.py:35:20

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

        def wrapper(function, setup_func):
            function = globals()[function]
            setup_func = globals()[setup_func]
    likely benign LLM, confidence 0.90 Benchmark decorator resolves a function and setup function by name from module globals.
    Reasoning

    globals() lookup of a benchmark function by name inside a timing decorator, a common pattern for resolving names passed as strings to the benchmark wrapper. Nothing decodes, spawns or reaches the network.

  6. info warn → info by review dynamic-attribute fontTools/cu2qu/benchmark.py:36:22

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

            function = globals()[function]
            setup_func = globals()[setup_func]
    
            def wrapped():
    likely benign LLM, confidence 0.90 Second globals() name lookup in the same benchmark wrapper.
    Reasoning

    Same globals() name lookup in the benchmark wrapper; it only times a local conversion routine.

  7. info critical → info by review dynamic-import fontTools/help.py:18:23

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

            try:
                imports = __import__(pkg, globals(), locals(), ["main"])
            except ImportError as e:
                continue
    likely benign LLM, confidence 0.80 help() imports fontTools submodules by name to print their docstrings.
    Reasoning

    Loop imports known fontTools submodules to collect their help text, with ImportError swallowed. The package names are internal, so the dynamic import is a standard plugin or help-discovery idiom, not a payload loader.

  8. info warn → info by review dynamic-attribute fontTools/misc/cython.py:21:5

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

    for name in ("double", "complex", "int"):
        globals()[name] = None
    
    for name in ("cfunc", "inline"):
    likely benign LLM, confidence 0.90 Cython fallback stubs out type names in module globals.
    Reasoning

    Compatibility shim that sets placeholder names in globals when Cython is unavailable, a standard fallback so pure-Python mode works.

  9. info warn → info by review dynamic-attribute fontTools/misc/cython.py:24:5

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

    for name in ("cfunc", "inline"):
        globals()[name] = _empty_decorator
    
    locals = lambda **_: _empty_decorator
    likely benign LLM, confidence 0.90 Cython fallback installs no-op decorators into module globals.
    Reasoning

    Same Cython fallback: decorator names are assigned to no-op stand-ins in globals when Cython is absent.

  10. info warn → info by review dynamic-attribute fontTools/misc/loggingTools.py:294:20

    reach-by-name through `locals.get` (ast pass, confidence 0.60)

                for arg in ("msg", "level"):
                    if locals().get(arg) is not None:
                        raise ValueError("'%s' can't be specified without a 'logger'" % arg)
            self.logger = logger
    likely benign LLM, confidence 0.90 Checks local arguments to reject msg/level when a logger is supplied.
    Reasoning

    locals() is read to check whether msg or level were passed alongside a logger argument, a plain argument-validation check.

  11. info whitespace-anomaly fontTools/misc/macRes.py:10:1

    file mixes tab and space indentation (19 tab-indented and 178 space-indented lines) (raw pass, confidence 0.40)

    class ResourceError(Exception):
        pass
  12. info whitespace-anomaly fontTools/misc/psLib.py:4:1

    file mixes tab and space indentation (9 tab-indented and 320 space-indented lines) (raw pass, confidence 0.40)

    from .psOperators import (
        PSOperators,
        ps_StandardEncoding,
        ps_array,
  13. info whitespace-anomaly fontTools/misc/sstruct.py:26:1

    file mixes tab and space indentation (13 tab-indented and 129 space-indented lines) (raw pass, confidence 0.40)

    pack(fmt, object):
            'object' is either a dictionary or an instance (or actually
            anything that has a __dict__ attribute). If it is a dictionary,
            its keys are used for names. If it is an instance, it's
  14. info whitespace-anomaly fontTools/misc/symfont.py:20:1

    file mixes tab and space indentation (40 tab-indented and 113 space-indented lines) (raw pass, confidence 0.40)

    for i in range(1, n + 1):
        last = BinomialCoefficient[-1]
        this = tuple(last[j - 1] + last[j] for j in range(len(last))) + (0,)
        BinomialCoefficient.append(this)
  15. info warn → info by review dynamic-execution fontTools/misc/symfont.py:239:25

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

            penName = sys.argv[1]
            funcs = [(name, eval(f)) for name, f in zip(sys.argv[2::2], sys.argv[3::2])]
            printGreenPen(penName, funcs, file=sys.stdout)
    likely benign LLM, confidence 0.70 Developer CLI evals user-supplied Python expressions from argv to build pen functions.
    Reasoning

    eval on command-line arguments in a developer script that prints glyph pen output. The user supplies the expressions to their own process, so it is an unsafe-looking but unremarkable dev-tool pattern, not hidden malicious execution.

  16. info warn → info by review dynamic-attribute fontTools/qu2cu/benchmark.py:38:20

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

        def wrapper(function, setup_func):
            function = globals()[function]
            setup_func = globals()[setup_func]
    likely benign LLM, confidence 0.90 Benchmark decorator resolves functions by name from module globals.
    Reasoning

    Same benchmark-decorator globals() name resolution as the cu2qu benchmark.

  17. info warn → info by review dynamic-attribute fontTools/qu2cu/benchmark.py:39:22

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

            function = globals()[function]
            setup_func = globals()[setup_func]
    
            def wrapped():
    likely benign LLM, confidence 0.90 Second globals() name lookup in the qu2cu benchmark wrapper.
    Reasoning

    Same globals() lookup in the benchmark wrapper, used only for timing.

  18. info whitespace-anomaly fontTools/ttLib/__main__.py:8:1

    file mixes tab and space indentation (8 tab-indented and 116 space-indented lines) (raw pass, confidence 0.40)

    def main(args=None):
        """Open/save fonts with TTFont() or TTCollection()
    
          ./fonttools ttLib [-oFILE] [-yNUMBER] files...
  19. info whitespace-anomaly fontTools/ttLib/sfnt.py:32:1

    file mixes tab and space indentation (43 tab-indented and 518 space-indented lines) (raw pass, confidence 0.40)

    class SFNTReader(object):
        def __new__(cls, *args, **kwargs):
            """Return an instance of the SFNTReader sub-class which is compatible
            with the input file type.
  20. info warn → info by review decoder-decompress-payload fontTools/ttLib/sfnt.py:599:20

    file imports decoder module(s) zlib and calls `.decompress()` — embedded payload decompressed at runtime (ast pass, confidence 0.75)

                    )
                data = zlib.decompress(rawData)
                if len(data) != self.origLength:
                    raise TTLibError(
    likely benign LLM, confidence 0.90 Decompresses a zlib-compressed WOFF table during font loading.
    Reasoning

    zlib.decompress of a WOFF table's raw data, checked against the declared origLength. This is the standard WOFF format decoding path, not a hidden payload.

  21. info warn → info by review dynamic-attribute fontTools/ttLib/tables/BitmapGlyphMetrics.py:49:17

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

                if name in metricNames:
                    vars(self)[name] = safeEval(attrs["value"])
                else:
                    log.warning(
    likely benign LLM, confidence 0.85 XML fromXML sets a whitelisted metric attribute via vars(self) using safeEval.
    Reasoning

    Sets an XML-parsed attribute on the object after filtering against a fixed list of metric names, with values passed through safeEval, the restricted literal evaluator. This is ordinary table deserialization.

  22. info whitespace-anomaly fontTools/ttLib/tables/D_S_I_G_.py:12:1

    file mixes tab and space indentation (12 tab-indented and 104 space-indented lines) (raw pass, confidence 0.40)

    if TYPE_CHECKING:
        from fontTools.misc.xmlWriter import XMLWriter
        from fontTools.ttLib import TTFont
  23. info whitespace-anomaly fontTools/ttLib/tables/E_B_D_T_.py:3:1

    file mixes tab and space indentation (6 tab-indented and 642 space-indented lines) (raw pass, confidence 0.40)

    from fontTools.misc.textTools import (
        bytechr,
        byteord,
        bytesjoin,
  24. info warn → info by review dynamic-attribute fontTools/ttLib/tables/E_B_D_T_.py:233:17

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

                if name in componentNames:
                    vars(self)[name] = safeEval(attrs["value"])
                else:
                    log.warning("unknown name '%s' being ignored by EbdtComponent.", name)
    likely benign LLM, confidence 0.85 EBDT component XML parsing sets whitelisted attributes via vars(self) with safeEval.
    Reasoning

    Same whitelisted-name attribute assignment with safeEval for EBDT component XML parsing.

  25. info whitespace-anomaly fontTools/ttLib/tables/E_B_L_C_.py:5:1

    file mixes tab and space indentation (28 tab-indented and 544 space-indented lines) (raw pass, confidence 0.40)

    from .BitmapGlyphMetrics import (
        BigGlyphMetrics,
        bigGlyphMetricsFormat,
        SmallGlyphMetrics,
  26. info warn → info by review dynamic-attribute fontTools/ttLib/tables/E_B_L_C_.py:103:17

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

                    metricObj = SbitLineMetrics()
                    vars(curTable)[metric] = metricObj
                    dummy = sstruct.unpack2(
                        sbitLineMetricsFormat, data[i : i + 12], metricObj
    likely benign LLM, confidence 0.90 EBLC table stores a sbit line metrics object on itself via vars() during binary decoding.
    Reasoning

    Stores a metric object on the table under a fixed metric name and then unpacks binary data into it using sstruct, standard binary table handling.

  27. info warn → info by review dynamic-attribute fontTools/ttLib/tables/E_B_L_C_.py:236:29

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

                for metric in ("hori", "vert"):
                    metricObj = vars(curTable)[metric]
                    data = sstruct.pack(sbitLineMetricsFormat, metricObj)
                    dataList.append(data)
    likely benign LLM, confidence 0.90 EBLC serialization reads hori/vert metric objects via vars() to pack them.
    Reasoning

    Reads fixed hori/vert metric attributes to pack them back to binary, the serialization counterpart of the code above.

  28. info warn → info by review dynamic-attribute fontTools/ttLib/tables/E_B_L_C_.py:339:17

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

                    metricObj.fromXML(name, attrs, content, ttFont)
                    vars(self)[direction] = metricObj
                elif name in dataNames:
                    vars(self)[name] = safeEval(attrs["value"])
    likely benign LLM, confidence 0.85 EBLC XML parser stores direction metrics and whitelisted data values via vars().
    Reasoning

    XML parsing assigns the direction-specific metric object or a whitelisted data name with safeEval, consistent with the other table modules.

  29. info warn → info by review dynamic-attribute fontTools/ttLib/tables/E_B_L_C_.py:341:17

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

                elif name in dataNames:
                    vars(self)[name] = safeEval(attrs["value"])
                else:
                    log.warning("unknown name '%s' being ignored in BitmapSizeTable.", name)
    likely benign LLM, confidence 0.85 Sets a whitelisted BitmapSizeTable attribute from parsed XML via vars(self).
    Reasoning

    The name is checked against a fixed whitelist (dataNames) before the vars(self) assignment, and the value goes through safeEval. This is a reflective setter over known XML attributes, not a hidden channel.

  30. info warn → info by review dynamic-attribute fontTools/ttLib/tables/E_B_L_C_.py:363:17

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

                if name in metricNames:
                    vars(self)[name] = safeEval(attrs["value"])
    likely benign LLM, confidence 0.85 Sets a whitelisted metric attribute from XML via vars(self).
    Reasoning

    Same pattern as the sibling finding: the name is guarded by membership in metricNames and the value passes through safeEval. Ordinary XML deserialization for font metrics.

  31. info whitespace-anomaly fontTools/ttLib/tables/F_F_T_M_.py:7:1

    file mixes tab and space indentation (5 tab-indented and 31 space-indented lines) (raw pass, confidence 0.40)

    FFTMFormat = """
    		>	# big endian
    		version:        I
    		FFTimeStamp:    Q
  32. info whitespace-anomaly fontTools/ttLib/tables/O_S_2f_2.py:13:1

    file mixes tab and space indentation (50 tab-indented and 602 space-indented lines) (raw pass, confidence 0.40)

    panoseFormat = """
    	bFamilyType:        B
    	bSerifStyle:        B
    	bWeight:            B
  33. info whitespace-anomaly fontTools/ttLib/tables/S_V_G_.py:9:1

    file mixes tab and space indentation (9 tab-indented and 159 space-indented lines) (raw pass, confidence 0.40)

    
            <SVG>
                    <svgDoc endGlyphID="1" startGlyphID="1">
                            <![CDATA[ <complete SVG doc> ]]
  34. info whitespace-anomaly fontTools/ttLib/tables/V_D_M_X_.py:7:1

    file mixes tab and space indentation (17 tab-indented and 202 space-indented lines) (raw pass, confidence 0.40)

    VDMX_HeaderFmt = """
    	>                 # big endian
    	version:     H    # Version number (0 or 1)
    	numRecs:     H    # Number of VDMX groups present
  35. info whitespace-anomaly fontTools/ttLib/tables/_g_l_y_f.py:13:1

    file mixes tab and space indentation (6 tab-indented and 2012 space-indented lines) (raw pass, confidence 0.40)

    from fontTools.misc.fixedTools import (
        fixedToFloat as fi2fl,
        floatToFixed as fl2fi,
        floatToFixedToStr as fl2str,
  36. info whitespace-anomaly fontTools/ttLib/tables/_g_v_a_r.py:28:1

    file mixes tab and space indentation (9 tab-indented and 275 space-indented lines) (raw pass, confidence 0.40)

    GVAR_HEADER_FORMAT_HEAD = """
    	> # big endian
    	version:			H
    	reserved:			H
  37. info whitespace-anomaly fontTools/ttLib/tables/_h_d_m_x.py:8:1

    file mixes tab and space indentation (4 tab-indented and 98 space-indented lines) (raw pass, confidence 0.40)

    hdmxHeaderFormat = """
    	>   # big endian!
    	version:	H
    	numRecords:	H
  38. info whitespace-anomaly fontTools/ttLib/tables/_h_e_a_d.py:5:1

    file mixes tab and space indentation (18 tab-indented and 86 space-indented lines) (raw pass, confidence 0.40)

    from fontTools.misc.timeTools import (
        timestampFromString,
        timestampToString,
        timestampNow,
  39. info whitespace-anomaly fontTools/ttLib/tables/_h_h_e_a.py:4:1

    file mixes tab and space indentation (18 tab-indented and 98 space-indented lines) (raw pass, confidence 0.40)

    from fontTools.misc.fixedTools import (
        ensureVersionIsLong as fi2ve,
        versionToFixed as ve2fi,
    )
  40. info whitespace-anomaly fontTools/ttLib/tables/_m_a_x_p.py:6:1

    file mixes tab and space indentation (17 tab-indented and 109 space-indented lines) (raw pass, confidence 0.40)

    maxpFormat_0_5 = """
    		>	# big endian
    		tableVersion:           i
    		numGlyphs:              H
  41. info whitespace-anomaly fontTools/ttLib/tables/_n_a_m_e.py:6:1

    file mixes tab and space indentation (7 tab-indented and 1071 space-indented lines) (raw pass, confidence 0.40)

    from fontTools.misc.textTools import (
        bytechr,
        byteord,
        bytesjoin,
  42. info whitespace-anomaly fontTools/ttLib/tables/_p_o_s_t.py:14:1

    file mixes tab and space indentation (10 tab-indented and 259 space-indented lines) (raw pass, confidence 0.40)

    postFormat = """
    	>
    	formatType:			16.16F
    	italicAngle:		16.16F		# italic angle in degrees
  43. info whitespace-anomaly fontTools/ttLib/tables/_s_b_i_x.py:7:1

    file mixes tab and space indentation (13 tab-indented and 79 space-indented lines) (raw pass, confidence 0.40)

    sbixHeaderFormat = """
    	>
    	version:       H	# Version number (set to 1)
    	flags:         H	# The only two bits used in the flags field are bits 0
  44. info whitespace-anomaly fontTools/ttLib/tables/_t_r_a_k.py:3:1

    file mixes tab and space indentation (14 tab-indented and 231 space-indented lines) (raw pass, confidence 0.40)

    from fontTools.misc.fixedTools import (
        fixedToFloat as fi2fl,
        floatToFixed as fl2fi,
        floatToFixedToStr as fl2str,
  45. info whitespace-anomaly fontTools/ttLib/tables/_v_h_e_a.py:4:1

    file mixes tab and space indentation (18 tab-indented and 92 space-indented lines) (raw pass, confidence 0.40)

    from fontTools.misc.fixedTools import (
        ensureVersionIsLong as fi2ve,
        versionToFixed as ve2fi,
    )
  46. info warn → info by review dynamic-execution fontTools/ttLib/tables/otBase.py:959:37

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

                else:
                    if conv.aux and not eval(conv.aux, None, self.__dict__):
                        continue
                    if hasattr(self, conv.name):
    likely benign LLM, confidence 0.85 Evaluates a conditional expression from OpenType converter metadata during table decompile.
    Reasoning

    The eval evaluates conv.aux, a condition expression from fontTools' own OpenType table definitions, not attacker-supplied text. This is the library's documented mechanism for conditional fields.

  47. info warn → info by review dynamic-execution fontTools/ttLib/tables/otBase.py:997:41

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

                    else:
                        if conv.aux and not eval(conv.aux, None, table):
                            continue
                        table[conv.name] = conv.read(reader, font, table)
    likely benign LLM, confidence 0.85 Evaluates a conditional field expression from internal OpenType spec during reading.
    Reasoning

    eval of conv.aux comes from the library's internal table spec, so the input is trusted code-generated metadata. Same legitimate conditional-field mechanism.

  48. info warn → info by review dynamic-execution fontTools/ttLib/tables/otBase.py:1101:37

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

                else:
                    if conv.aux and not eval(conv.aux, None, table):
                        continue
                    try:
    likely benign LLM, confidence 0.85 Evaluates a conditional field expression from the internal OpenType spec during table handling.
    Reasoning

    eval of conv.aux from the static OpenType spec, used to decide whether to skip a field. Standard fontTools behavior.

  49. info warn → info by review dynamic-execution fontTools/ttLib/tables/otBase.py:1143:37

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

                else:
                    if conv.aux and not eval(conv.aux, None, vars(self)):
                        continue
                    value = getattr(
    likely benign LLM, confidence 0.85 Evaluates a spec-defined condition over table attributes during table compilation.
    Reasoning

    eval of the static spec's aux expression over the table's own vars, to gate field processing. No external input reaches the expression.

  50. info warn → info by review dynamic-execution fontTools/ttLib/tables/otConverters.py:87:34

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

                else:
                    converterClass = eval(spec.type, tableNamespace, converterMapping)
    
            conv = converterClass(
    likely benign LLM, confidence 0.85 Resolves a converter class by evaluating a spec type name against a fixed namespace.
    Reasoning

    eval resolves a converter class name from spec.type inside a fixed namespace and mapping. The inputs come from fontTools' bundled table definitions, so this is a class lookup, not code injection.

  51. info warn → info by review dynamic-execution fontTools/ttLib/tables/otConverters.py:134:24

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

            if self.aux and not self.repeat:
                self.aux = compile(self.aux, "<string>", "eval")
            self.tableClass = tableClass
            self.isCount = name.endswith("Count") or name in [
    likely benign LLM, confidence 0.85 Compiles a spec-defined condition expression once at converter construction.
    Reasoning

    compile of self.aux in eval mode turns a spec-defined condition into a code object, with the source coming from the library's own table definitions. No runtime attacker input is involved.

  52. info warn → info by review dynamic-execution fontTools/ttLib/tables/otTables.py:1741:37

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

                else:
                    if conv.aux and not eval(conv.aux, None, vars(self)):
                        continue
                    value = getattr(
    likely benign LLM, confidence 0.85 Evaluates a spec-defined conditional expression over table attributes.
    Reasoning

    Same spec-driven eval of conv.aux over vars(self) as the otBase findings, part of the normal OpenType decompile/compile flow.

  53. info whitespace-anomaly fontTools/ttLib/tables/sbixGlyph.py:6:1

    file mixes tab and space indentation (10 tab-indented and 114 space-indented lines) (raw pass, confidence 0.40)

    sbixGlyphHeaderFormat = """
    	>
    	originOffsetX: h	# The x-value of the point in the glyph relative to its
    						# lower-left corner which corresponds to the origin of
  54. file mixes tab and space indentation (8 tab-indented and 137 space-indented lines) (raw pass, confidence 0.40)

    sbixStrikeHeaderFormat = """
    	>
    	ppem:          H	# The PPEM for which this strike was designed (e.g., 9,
    						# 12, 24)
  55. info warn → info by review encoding-octal fontTools/ttLib/tables/ttProgram.py:582:44

    6 rows of escape runs, lines 582-582 (first: 32 consecutive `\NNN` octal escapes (entropy 5.0 bits/byte)) (raw pass, confidence 0.65)

        bc = b"""@;:9876543210/.-,+*)(\'&%$#"! \037\036\035\034\033\032\031\030\027\026\025\024\023\022\021\020\017\016\015\014\013\012\011\010\007\006\005\004\003\002\001\000,\001\260\030CXEj\260\031C`\260F#D#\020 \260FN\360M/\260\000\022\033!#\0213Y-,\001\260\030CX\260\005+\260\000\023K\260\024PX\261\000@8Y\260\006+\033!
    likely benign LLM, confidence 0.80 A bytes literal holding a TrueType bytecode program written with octal escapes.
    Reasoning

    The raw pass flags a long bytes literal of octal escapes. That is the expected form of a TrueType bytecode program (the instruction stream of a fixed built-in table), which contains many small byte values. Raw-pass findings have a high false-positive rate and this is a known data constant, not an encoded payload.

  56. info warn → info by review dynamic-attribute fontTools/ttLib/ttFont.py:254:19

    reach-by-name through `locals.get` (ast pass, confidence 0.60)

            for name in ("verbose", "quiet"):
                val = locals().get(name)
                if val is not None:
                    deprecateArgument(name, "configure logging instead")
    likely benign LLM, confidence 0.90 Reads deprecated verbose/quiet arguments from locals to warn users.
    Reasoning

    locals().get reads the names 'verbose' and 'quiet' from the function's own arguments to emit a deprecation warning. It is a fixed, local lookup with no dynamic execution.

  57. info critical → info by review dynamic-import fontTools/ttLib/ttFont.py:1434:9

    `__import__` called on a non-literal expression (ast pass, confidence 0.90)

        try:
            __import__("fontTools.ttLib.tables." + pyTag)
        except ImportError as err:
            # If pyTag is found in the ImportError message,
    likely benign LLM, confidence 0.80 Dynamically imports the fontTools table module matching a font's table tag.
    Reasoning

    The import is built from a fixed 'fontTools.ttLib.tables.' prefix plus pyTag, which is derived from a font table tag and converted to a Python identifier. Only modules inside fontTools' own tables package can be loaded, and ImportError is caught for unknown tags. That is the standard dynamic table-loader pattern, though the severity is high because the tag comes from untrusted font data.

  58. info whitespace-anomaly fontTools/ttLib/woff2.py:10:1

    file mixes tab and space indentation (36 tab-indented and 1383 space-indented lines) (raw pass, confidence 0.40)

    from fontTools.ttLib import (
        TTFont,
        TTLibError,
        getTableModule,
  59. info whitespace-anomaly fontTools/varLib/cff.py:3:1

    file mixes tab and space indentation (12 tab-indented and 501 space-indented lines) (raw pass, confidence 0.40)

    from fontTools.cffLib import (
        maxStackLimit,
        TopDictIndex,
        buildOrder,

Reproduce This Scan

Run disclude locally to verify. These commands scan the published file; the "new in this release" marks come from comparing it with the previous release's file, which they don't repeat. 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.3.0
curl -fsSL -o fonttools-4.67.0-py3-none-any.whl https://files.pythonhosted.org/packages/3d/61/4161946319472aaa9b897bd18ad5108a5b10f5ebaa503d921a001ac4fff9/fonttools-4.67.0-py3-none-any.whl
printf '%s  %s\n' 4304f03ed7f4ba000a8dcc941ad854bfa52e2f3b6112b8f099b6f431cf98e701 fonttools-4.67.0-py3-none-any.whl | shasum -a 256 -c -
unzip -q fonttools-4.67.0-py3-none-any.whl -d pkg
disclude scan --untrusted --severity info pkg