Free (libre) font editor for Windows, Mac OS X and GNU+Linux
This report summarizes scanner evidence for fontforge/fontforge, a C project with 8,057 GitHub stars. SynthScan examined 577,577 lines of code across 754 source files, recording 434 pattern matches distributed across 16 syntactic categories. The legacy adjusted pattern signal is 1.0 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 346 finding(s).
Are imports declared and package/API names verified? 16 finding(s).
Are wrappers, guards, and repeated structures necessary? 82 finding(s).
Which changes need focused human review? 434 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 434 distinct pattern matches across 16 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | inc/utype.h | 41 | #define UNICODE_VERSION "17.0.0" | COMMENT |
| LOW | inc/utype.h | 101 | #undef islower | COMMENT |
| LOW | inc/utype.h | 121 | #undef ishexdigit | COMMENT |
| LOW | inc/utype.h | 141 | #define iscombining(ch) ff_unicode_iscombining((ch)) | COMMENT |
| LOW | inc/gwwiconv.h | 41 | # if _LIBICONV_VERSION >= 0x10B | COMMENT |
| LOW | inc/gwidget.h | 121 | #define gwwv_choose_multiple GWidgetChoicesBM8 | COMMENT |
| LOW | inc/gkeysym.h | 1 | #ifndef FONTFORGE_GKEYSYM_H | COMMENT |
| LOW | inc/gkeysym.h | 21 | #define GK_Escape GDK_KEY_Escape | COMMENT |
| LOW | inc/gkeysym.h | 41 | #define GK_KP_Home GDK_KEY_KP_Home | COMMENT |
| LOW | inc/gkeysym.h | 61 | #define GK_F9 GDK_KEY_F9 | COMMENT |
| LOW | inc/gkeysym.h | 81 | #define GK_F20 GDK_KEY_F20 | COMMENT |
| LOW | inc/gkeysym.h | 101 | #define GK_F30 GDK_KEY_F30 | COMMENT |
| LOW | inc/gkeysym.h | 121 | #define GK_Meta_L GDK_KEY_Meta_L | COMMENT |
| LOW | inc/gfile.h | 41 | #ifdef _MSC_VER | COMMENT |
| LOW | inc/basics.h | 21 | * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; | COMMENT |
| LOW | inc/basics.h | 41 | COMMENT | |
| LOW | inc/basics.h | 61 | COMMENT | |
| LOW | inc/basics.h | 141 | // This is for GNU Hurd, not GCC. | COMMENT |
| LOW | inc/gprogress.h | 61 | COMMENT | |
| LOW | inc/ffunistd.h | 41 | #include <direct.h> | COMMENT |
| LOW | inc/ffunistd.h | 61 | #endif | COMMENT |
| LOW | inc/carbon.h | 1 | #ifndef FONTFORGE_CARBON_H | COMMENT |
| LOW | inc/intl.h | 41 | # endif | COMMENT |
| LOW | inc/ffglib.h | 21 | COMMENT | |
| LOW | inc/ffglib.h | 41 | COMMENT | |
| LOW | inc/ffgdk.h | 41 | #include <gtk/gtk.h> | COMMENT |
| LOW | fontforgeexe/displayfonts.c | 21 | * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; | COMMENT |
| LOW | fontforgeexe/displayfonts.c | 81 | #define CID_lpr 1002 | COMMENT |
| LOW | fontforgeexe/displayfonts.c | 561 | if ( fv->b.selected[i] && (gid=fv->b.map->map[i])!=-1 && | COMMENT |
| LOW | fontforgeexe/displayfonts.c | 581 | #define CID_SizeLab 2003 | COMMENT |
| LOW | fontforgeexe/tilepath.c | 21 | * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; | COMMENT |
| LOW | fontforgeexe/problems.cpp | 41 | COMMENT | |
| LOW | fontforgeexe/problems.cpp | 101 | struct mlrpl *mlt; | COMMENT |
| LOW | fontforgeexe/problems.cpp | 121 | #define CID_HintNoPt 1007 | COMMENT |
| LOW | fontforgeexe/problems.cpp | 141 | #define CID_TooManyHints 1035 | COMMENT |
| LOW | fontforgeexe/startui.c | 21 | * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; | COMMENT |
| LOW | fontforgeexe/startui.c | 41 | #include "lookups.h" | COMMENT |
| LOW | fontforgeexe/startui.c | 61 | #else | COMMENT |
| LOW | fontforgeexe/prefs.c | 21 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | COMMENT |
| LOW | fontforgeexe/prefs.c | 41 | #include "plugin.h" | COMMENT |
| LOW | fontforgeexe/cursors.c | 321 | 0x20, 0x49, 0x92, 0x20, 0x49, 0x92, 0xe0, 0xff, 0xff, 0x00, 0x00, 0x00}; | COMMENT |
| LOW | fontforgeexe/cursors.c | 401 | #define rotate3dcur_width 16 | COMMENT |
| LOW | fontforgeexe/cursors.c | 461 | #define rectcur_height 8 | COMMENT |
| LOW | fontforgeexe/cursors.c | 521 | #define shift_x_hot 7 | COMMENT |
| LOW | fontforgeexe/mv_mids.h | 21 | /* Display options */ | COMMENT |
| LOW | fontforgeexe/mv_mids.h | 41 | #define MV_MID_AnchorPairs 3019 | COMMENT |
| LOW | fontforgeexe/mv_mids.h | 81 | COMMENT | |
| LOW | fontforgeexe/mv_mids.h | 101 | #define MV_MID_BuildComposite 3112 | COMMENT |
| LOW | fontforgeexe/mv_mids.h | 121 | #define MV_MID_Thirds 3151 | COMMENT |
| LOW | fontforgeexe/math.c | 21 | * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; | COMMENT |
| LOW | fontforgeexe/effectsui.c | 21 | * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; | COMMENT |
| LOW | fontforgeexe/transform.c | 41 | void *userdata; | COMMENT |
| LOW | fontforgeexe/transform.c | 61 | #define CID_Angle 1004 | COMMENT |
| LOW | fontforgeexe/charinfo.c | 21 | * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | COMMENT |
| LOW | fontforgeexe/charinfo.c | 81 | #define CID_ComponentTextField 1008 | COMMENT |
| LOW | fontforgeexe/charinfo.c | 101 | #define CID_AccentDevTab 1025 | COMMENT |
| LOW | fontforgeexe/charinfo.c | 121 | #define CID_MergeResults 1115 | COMMENT |
| LOW | fontforgeexe/scstylesui.c | 341 | #define CID_Feature 1001 | COMMENT |
| LOW | fontforgeexe/scstylesui.c | 361 | #define CID_LSBPercent 1026 | COMMENT |
| LOW | fontforgeexe/scstylesui.c | 1821 | #define CID_Custom 1005 | COMMENT |
| 244 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | pyproject.toml | 99 | # ============================================================================ | COMMENT |
| MEDIUM | pyproject.toml | 101 | # ============================================================================ | COMMENT |
| MEDIUM | Unicode/makeutype.py | 188 | # -------------------------------------------------------------------- | COMMENT |
| MEDIUM | Unicode/makeutype.py | 331 | # -------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | tests/test926.py | 76 | # ---------------------- | COMMENT |
| MEDIUM⚡ | tests/test926.py | 78 | # ---------------------- | COMMENT |
| MEDIUM | tests/test926.py | 166 | # ------------ | COMMENT |
| MEDIUM | tests/test926.py | 522 | # ---------------------- | COMMENT |
| MEDIUM | tests/test926.py | 524 | # ---------------------- | COMMENT |
| MEDIUM | tests/test926.py | 569 | # ------------- | COMMENT |
| MEDIUM | tests/test926.py | 571 | # ------------- | COMMENT |
| MEDIUM | tests/test926.py | 1744 | # ---------------- | COMMENT |
| MEDIUM | tests/test926.py | 1746 | # ---------------- | COMMENT |
| MEDIUM | tests/test926.py | 1804 | # ------------------------- | COMMENT |
| MEDIUM | tests/test926.py | 1806 | # ------------------------- | COMMENT |
| MEDIUM⚡ | tests/test926.py | 86 | # ---------- | STRING |
| MEDIUM⚡ | tests/test926.py | 88 | # ---------- | STRING |
| MEDIUM | tests/test926.py | 120 | # -------------- | STRING |
| MEDIUM | tests/test926.py | 122 | # -------------- | STRING |
| MEDIUM | tests/test926.py | 768 | # ------------- | STRING |
| MEDIUM | tests/test926.py | 770 | # ------------- | STRING |
| MEDIUM | tests/test926.py | 903 | # ---------------------- | STRING |
| MEDIUM | tests/test926.py | 905 | # ---------------------- | STRING |
| MEDIUM | tests/test926.py | 1205 | # ----------------- | STRING |
| MEDIUM | tests/test926.py | 1207 | # ----------------- | STRING |
| MEDIUM | tests/test926.py | 1248 | # ---------------- | STRING |
| MEDIUM | tests/test926.py | 1250 | # ---------------- | STRING |
| MEDIUM | tests/test926.py | 1899 | # ------------------ | STRING |
| MEDIUM | tests/test926.py | 1901 | # ------------------ | STRING |
| MEDIUM | tests/test926.py | 1953 | # --------------------------------- | STRING |
| MEDIUM | tests/test926.py | 1955 | # --------------------------------- | STRING |
| MEDIUM | tests/test926.py | 2575 | # ------------------ | STRING |
| MEDIUM | tests/test926.py | 2577 | # ------------------ | STRING |
| MEDIUM | tests/test926.py | 2629 | # ----------------------- | STRING |
| MEDIUM | tests/test926.py | 2631 | # ----------------------- | STRING |
| MEDIUM | tests/test926.py | 2650 | # --------------- | STRING |
| MEDIUM | tests/test926.py | 2652 | # --------------- | STRING |
| MEDIUM | pycontrib/GlyphAlignment/GlyphAlignment.py | 2 | # ======================================================== | COMMENT |
| MEDIUM | pycontrib/GlyphAlignment/GlyphAlignment.py | 4 | # ======================================================== | COMMENT |
| MEDIUM | pycontrib/GlyphAlignment/GlyphAlignment.py | 88 | # ======================================================== | COMMENT |
| MEDIUM | pycontrib/GlyphAlignment/GlyphAlignment.py | 90 | # ======================================================== | COMMENT |
| MEDIUM | pycontrib/GlyphAlignment/GlyphAlignment.py | 131 | # ======================================================== | COMMENT |
| MEDIUM | pycontrib/GlyphAlignment/GlyphAlignment.py | 133 | # ======================================================== | COMMENT |
| MEDIUM | pycontrib/GlyphAlignment/GlyphAlignment.py | 166 | # ======================================================== | COMMENT |
| MEDIUM | pycontrib/GlyphAlignment/GlyphAlignment.py | 168 | # ======================================================== | COMMENT |
| MEDIUM | pycontrib/GlyphAlignment/GlyphAlignment.py | 209 | # ======================================================== | COMMENT |
| MEDIUM | .github/workflows/scripts/ffosxbuild.sh | 111 | # --------------------------------------------------------------------------- | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | tests/test931.py | 83 | except: | CODE |
| HIGH | tests/test931.py | 90 | except: | CODE |
| HIGH | tests/test931.py | 97 | except: | CODE |
| HIGH | tests/test931.py | 113 | except: | CODE |
| HIGH | tests/test931.py | 121 | except: | CODE |
| HIGH | tests/test931.py | 150 | except: | CODE |
| HIGH | tests/test0004.py | 15 | except TypeError: | CODE |
| HIGH | tests/test930.py | 145 | except TypeError: | CODE |
| HIGH | tests/test930.py | 152 | except TypeError: | CODE |
| HIGH | tests/test930.py | 213 | except: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | pycontrib/FontCompare/setup.py | 0 | copyright (c) 2013 mayank jha <mayank25080562@gmail.com> this library is free software; you can redistribute it and/or m | STRING |
| HIGH | pycontrib/FontCompare/fc/BitmapHandler.py | 0 | copyright (c) 2013 mayank jha <mayank25080562@gmail.com> this library is free software; you can redistribute it and/or m | STRING |
| HIGH | pycontrib/FontCompare/fc/__init__.py | 0 | copyright (c) 2013 mayank jha <mayank25080562@gmail.com> this library is free software; you can redistribute it and/or m | STRING |
| HIGH | pycontrib/FontCompare/fc/FontCompare.py | 0 | copyright (c) 2013 mayank jha <mayank25080562@gmail.com> this library is free software; you can redistribute it and/or m | STRING |
| HIGH | pycontrib/FontCompare/fc/DocCompare.py | 0 | copyright (c) 2013 mayank jha <mayank25080562@gmail.com> this library is free software; you can redistribute it and/or m | STRING |
| HIGH | pycontrib/FontCompare/fc/main_ui.py | 0 | copyright (c) 2013 mayank jha <mayank25080562@gmail.com> this library is free software; you can redistribute it and/or m | STRING |
| HIGH | pycontrib/FontCompare/fc/mockify.py | 0 | copyright (c) 2013 mayank jha <mayank25080562@gmail.com> this library is free software; you can redistribute it and/or m | STRING |
| HIGH | pycontrib/FontCompare/fc/GlyphConsistency.py | 0 | copyright (c) 2013 mayank jha <mayank25080562@gmail.com> this library is free software; you can redistribute it and/or m | STRING |
| HIGH | pycontrib/FontCompare/unittests/unittests.py | 0 | copyright (c) 2013 mayank jha <mayank25080562@gmail.com> this library is free software; you can redistribute it and/or m | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test_font_hooks.py | 8 | # Create a new font. We expect to find the dummy character which was created | COMMENT |
| MEDIUM | tests/test_bitmap_export.py | 59 | # Create a descriptive filename with font type label | COMMENT |
| MEDIUM | tests/test1006.py | 22 | # Create a glyph for the 'x' letter, so that math->AccentBaseHeight is nonzero. | COMMENT |
| MEDIUM | tests/test1006.py | 39 | # Create a glyph for the '+' letter, so that math->AxisHeight is nonzero. | COMMENT |
| MEDIUM | tests/test_export.py | 1 | # Create a font with one glyph and another glyph referencing it, export the | COMMENT |
| MEDIUM | po/toengb.c | 152 | fprintf( output, "# This file is distributed under the same license as the FontForge package.\n" ); | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | Unicode/makeutype.py | 707 | fprint(" if (ch >= 0x600 && ch <= 0x6ff) {") | CODE |
| HIGH | Unicode/makeutype.py | 913 | fprint(" if (ch >= 0xAC00 && ch <= 0xD7A3) {") | CODE |
| HIGH | Unicode/makeutype.py | 931 | range_cond = "ch >= 0x%X && ch <= 0x%X" % (start, end) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | Unicode/makeutype.py | 335 | CODE | |
| LOW | Unicode/makeutype.py | 714 | CODE | |
| LOW | Unicode/makeutype.py | 198 | CODE | |
| LOW | Unicode/data/makeutypedata.py | 20 | CODE | |
| LOW | tests/test_bitmap_export.py | 122 | CODE | |
| LOW | tests/test926.py | 639 | CODE | |
| LOW | tests/test926.py | 1013 | CODE | |
| LOW | tests/test926.py | 1453 | CODE | |
| LOW | tests/test926.py | 1566 | CODE | |
| LOW | tests/test926.py | 1651 | CODE | |
| LOW | tests/test926.py | 2043 | CODE | |
| LOW | tests/test926.py | 2173 | CODE | |
| LOW | pycontrib/GlyphAlignment/GlyphAlignment.py | 91 | CODE | |
| LOW | po/fix_newlines.py | 4 | CODE | |
| LOW | doc/sphinx/_extensions/flex_grid.py | 72 | CODE | |
| LOW | doc/sphinx/_extensions/flex_grid.py | 139 | CODE | |
| LOW | doc/sphinx/_extensions/fontforge_scripting_domain.py | 247 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | Unicode/makeutype.py | 14 | CODE | |
| LOW | tests/test1010.py | 3 | CODE | |
| LOW | tests/test0004.py | 3 | CODE | |
| LOW | tests/test934.py | 5 | CODE | |
| LOW | tests/test_generate.py | 3 | CODE | |
| LOW | tests/test_generate.py | 3 | CODE | |
| LOW | tests/test_generate.py | 3 | CODE | |
| LOW | tests/test932.py | 3 | CODE | |
| LOW | tests/pyhook_smoketest.py | 2 | CODE | |
| LOW | tests/pyhook_smoketest.py | 5 | CODE | |
| LOW | tests/test926.py | 67 | CODE | |
| LOW | _build_meta/version_provider.py | 4 | CODE | |
| LOW | doc/sphinx/_extensions/flex_grid.py | 35 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_math_device_table.py | 28 | # Set table to None | COMMENT |
| LOW | tests/test_math_device_table.py | 34 | # Set element to None | COMMENT |
| LOW | contrib/setup_mac_deps.sh | 23 | # Check if running on macOS | COMMENT |
| LOW | po/fix_newlines.py | 30 | # Check if msgid ends with a newline | COMMENT |
| LOW | po/crowdin_id_update.sh | 3 | # Check if a file is provided as an argument | COMMENT |
| LOW | po/crowdin_id_update.sh | 9 | # Read the file line by line | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | gdraw/ggdkdraw.c | 1088 | // I've added autopaint cleanups before such calls, so this should | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | Unicode/data/makeutypedata.py | 20 | def map_canonical_combining_class(ccc: int) -> Pose: | CODE |
| LOW | tests/test_bitmap_export.py | 25 | def _make_deterministic_environment() -> None: | CODE |
| LOW | tests/test_bitmap_export.py | 81 | def _assert_identical_outputs(generated_files: list[str], refs_dir: str) -> None: | CODE |
| LOW | tests/test926.py | 2457 | function testResultToggleButtonHit(buttonID, className) { | CODE |
| LOW | pycontrib/FontCompare/fc/GlyphConsistency.py | 63 | def glyph_basicset_consistency(self, font, range_tuple): | CODE |
| LOW | pycontrib/GlyphAlignment/GlyphAlignment.py | 15 | def parse_and_apply_transform(glyph, command_str): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test_bitmap_export.py | 72 | except Exception as e: | CODE |
| LOW | tests/test_contextual_multirule.py | 95 | except Exception: | CODE |
| LOW | tests/test_style_set_names.py | 91 | except Exception: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | tests/test926.py | 46 | # or publicity pertaining to the work without specific, written prior | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | _build_meta/version_provider.py | 13 | __all__ = ["dynamic_metadata"] | CODE |
| LOW | pycontrib/FontCompare/fc/__init__.py | 33 | __all__ = ["FontCompare", "GlyhCompare","GlyphConsistency", \ | CODE |
| LOW | doc/sphinx/_extensions/fontforge_scripting_domain.py | 35 | logger = logging.getLogger(__name__) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | tests/test926.py | 535 | CODE | |
| LOW | tests/test926.py | 1853 | CODE | |
| LOW | tests/test926.py | 1860 | CODE | |
| LOW | tests/test926.py | 2627 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | po/fix_newlines.py | 47 | # Example usage | COMMENT |