Open Source Soldering Iron firmware
This report summarizes scanner evidence for Ralim/IronOS, a C project with 8,382 GitHub stars. SynthScan examined 507,621 lines of code across 1016 source files, recording 4550 pattern matches distributed across 11 syntactic categories. The legacy adjusted pattern signal is 6.5 (Moderate 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.
Can maintainers explain intent, assumptions, and trade-offs? 4490 finding(s).
Are imports declared and package/API names verified? 28 finding(s).
Are wrappers, guards, and repeated structures necessary? 54 finding(s).
Which changes need focused human review? 4550 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 4550 distinct pattern matches across 11 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 | source/Core/Inc/main.hpp | 41 | #endif | COMMENT |
| LOW | source/Core/Inc/Settings.h | 161 | // #ifdef TIPTYPE_TS80 | COMMENT |
| LOW | source/Core/Inc/Settings.h | 201 | uint16_t lookupHallEffectThreshold(); | COMMENT |
| LOW | source/Core/Inc/settingsGUI.hpp | 1 | /* | COMMENT |
| LOW | source/Core/Inc/Types.h | 1 | #ifndef TYPES_H_ | COMMENT |
| LOW | source/Core/Inc/power.hpp | 1 | /* | COMMENT |
| LOW | source/Core/Inc/Translation_multi.h | 1 | #ifndef TRANSLATION_MULTI_H_ | COMMENT |
| LOW | source/Core/Inc/stm32f1xx_hal_conf.h | 161 | #define MAC_ADDR0 2 | COMMENT |
| LOW | source/Core/Inc/stm32f1xx_hal_conf.h | 181 | #define PHY_CONFIG_DELAY ((uint32_t)0x00000FFF) | COMMENT |
| LOW | source/Core/Inc/stm32f1xx_hal_conf.h | 221 | #ifdef HAL_GPIO_MODULE_ENABLED | COMMENT |
| LOW | source/Core/Inc/stm32f1xx_hal_conf.h | 241 | #ifdef HAL_CORTEX_MODULE_ENABLED | COMMENT |
| LOW | source/Core/Inc/stm32f1xx_hal_conf.h | 261 | #ifdef HAL_SRAM_MODULE_ENABLED | COMMENT |
| LOW | source/Core/Inc/stm32f1xx_hal_conf.h | 281 | #ifdef HAL_PWR_MODULE_ENABLED | COMMENT |
| LOW | source/Core/Inc/stm32f1xx_hal_conf.h | 301 | #ifdef HAL_NAND_MODULE_ENABLED | COMMENT |
| LOW | source/Core/Inc/stm32f1xx_hal_conf.h | 321 | #ifdef HAL_IRDA_MODULE_ENABLED | COMMENT |
| LOW | source/Core/Drivers/accelerometers_common.h | 1 | #ifndef CORE_DRIVERS_ACCELEROMTERS_COMMON_H_ | COMMENT |
| LOW | source/Core/Drivers/LIS2DH12_defines.hpp | 1 | /* | COMMENT |
| LOW | source/Core/Drivers/LIS2DH12_defines.hpp | 21 | #define LIS_INT1_CFG 0xB0 | 0x80 | COMMENT |
| LOW | source/Core/Drivers/BMA223_defines.h | 1 | /* | COMMENT |
| LOW | source/Core/Drivers/BMA223_defines.h | 21 | #define BMA223_INT_STATUS_1 0x0A | COMMENT |
| LOW | source/Core/Drivers/BMA223_defines.h | 41 | #define BMA223_INT_1 0x23 | COMMENT |
| LOW | source/Core/Drivers/BMA223_defines.h | 61 | #define BMA223_OFC_OFFSET_Y 0x39 | COMMENT |
| LOW | source/Core/Drivers/FS2711.cpp | 1 | #include "configuration.h" | COMMENT |
| LOW | source/Core/Drivers/WS2812.h | 1 | /* | COMMENT |
| LOW | source/Core/Drivers/FS2711_defines.h | 1 | #ifndef _FS2711_DEFINE_HPP_ | COMMENT |
| LOW | source/Core/Drivers/FS2711_defines.h | 21 | #define FS2711_PROTOCOL_QC2A 4 | COMMENT |
| LOW | source/Core/Drivers/FS2711_defines.h | 41 | #define FS2711_REG_MODE_SET 0xA0 // Mode set | COMMENT |
| LOW | source/Core/Drivers/FS2711_defines.h | 61 | #define FS2711_REG_PROTOCOL_EXISTS 0xF8 | COMMENT |
| LOW | source/Core/Drivers/MMA8652FC_defines.h | 21 | COMMENT | |
| LOW | source/Core/Drivers/MMA8652FC_defines.h | 41 | #define TRANSIENT_CFG_REG 0x1D // TRANSIENT_CFG Transient Configuration Register | COMMENT |
| LOW | source/Core/Drivers/MMA8652FC_defines.h | 61 | #define CTRL_REG5 0x2E // CTRL_REG5 Interrupt Configuration Register | COMMENT |
| LOW | source/Core/Drivers/MMA8652FC_defines.h | 81 | #define Y_LSB_REG 0X04 | COMMENT |
| LOW | source/Core/Drivers/MMA8652FC_defines.h | 101 | #define FHZ400 0x1 // 400hz | COMMENT |
| LOW | source/Core/Drivers/MMA8652FC_defines.h | 121 | #define INT_EN_FF_MT 1 << 2 // Freefall/Motion Interrupt Enable | COMMENT |
| LOW | source/Core/Drivers/OLED.hpp | 21 | #endif | COMMENT |
| LOW | source/Core/Drivers/OLED.hpp | 41 | COMMENT | |
| LOW | source/Core/Drivers/HUB238.hpp | 1 | #pragma once | COMMENT |
| LOW | source/Core/Drivers/HUB238.hpp | 21 | #define HUB238_REG_GO_COMMAND 0x09 | COMMENT |
| LOW | source/Core/Drivers/Si7210_defines.h | 21 | #define SI7210_CTRL1 0xC6U | COMMENT |
| LOW | source/Core/Drivers/Si7210_defines.h | 41 | #define MEAS_MASK 0x80U | COMMENT |
| LOW | source/Core/Drivers/Si7210_defines.h | 61 | #define DSP_SIGM_DATA_FLAG 0x80U | COMMENT |
| LOW | source/Core/Drivers/Si7210_defines.h | 81 | #define DF_BURSTSIZE_2 0x1U << 5 | COMMENT |
| LOW | source/Core/Drivers/MSA301_defines.h | 1 | /* | COMMENT |
| LOW | source/Core/Drivers/MSA301_defines.h | 21 | #define MSA301_REG_CLICKSTATUS 0x0B ///< Register address for click/doubleclick status | COMMENT |
| LOW | source/Core/Drivers/Font.h | 501 | COMMENT | |
| LOW | source/Core/Drivers/Font.h | 581 | #endif | COMMENT |
| LOW | source/Core/Drivers/USBPD.cpp | 1 | #include "USBPD.h" | COMMENT |
| LOW | source/Core/Drivers/SC7A20_defines.h | 1 | /* | COMMENT |
| LOW | source/Core/Drivers/SC7A20_defines.h | 21 | #define SC7A20_CTRL_REG5 0x24 | COMMENT |
| LOW | source/Core/Drivers/SC7A20_defines.h | 41 | #define SC7A20_INT2_DURATION 0x37 | COMMENT |
| LOW | source/Core/BSP/BSP_QC.h | 21 | // Set the DP pin to 3.3V | COMMENT |
| LOW | source/Core/BSP/BSP.h | 1 | #include "BSP_Flash.h" | COMMENT |
| LOW | source/Core/BSP/BSP.h | 41 | #ifdef TIP_CURRENT_LIMIT_CHOP | COMMENT |
| LOW | source/Core/BSP/Pinecil/BSP.cpp | 1 | // BSP mapping functions | COMMENT |
| LOW | source/Core/BSP/Pinecil/BSP.cpp | 21 | COMMENT | |
| LOW | source/Core/BSP/Pinecil/Pins.h | 1 | /* | COMMENT |
| LOW | source/Core/BSP/Pinecil/Pins.h | 21 | #define TIP_TEMP_ADC1_CHANNEL ADC_CHANNEL_1 | COMMENT |
| LOW | source/Core/BSP/Pinecil/Pins.h | 41 | #define QC_DP_LOW_Pin BIT(7) | COMMENT |
| LOW | source/Core/BSP/Pinecil/configuration.h | 81 | #define POWER_PULSE_MAX 100 // x10 max watts | COMMENT |
| LOW | source/Core/BSP/Pinecil/configuration.h | 101 | * Detailed idle screen (off for first time users) | COMMENT |
| 4380 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | source/dfuse-pack.py | 255 | print("Error: IntelHex python module could not be found") | CODE |
| LOW | source/Settings/test_config_parser.py | 61 | except Exception as e: | CODE |
| LOW | source/Settings/test_config_parser.py | 84 | except Exception as e: | CODE |
| MEDIUM | source/Settings/test_config_parser.py | 85 | print(f"Error parsing {model}: {e}", file=sys.stderr) | CODE |
| LOW | source/Settings/config_parser.py | 264 | except Exception as e: | CODE |
| MEDIUM | source/Settings/config_parser.py | 265 | print(f"Error: {e}", file=sys.stderr) | CODE |
| MEDIUM | source/Settings/test_generate_settings.py | 24 | print(f"Error importing modules: {e}") | CODE |
| LOW⚡ | source/Settings/generate_settings.py | 100 | except Exception as e: | CODE |
| MEDIUM⚡ | source/Settings/generate_settings.py | 101 | print(f"Error loading settings definitions: {e}") | CODE |
| LOW⚡ | source/Settings/generate_settings.py | 111 | except Exception as nested_e: | CODE |
| LOW | source/Settings/generate_settings.py | 122 | except Exception as e: | CODE |
| MEDIUM | source/Settings/generate_settings.py | 123 | print(f"Error reading template file: {e}") | CODE |
| LOW | source/Settings/generate_settings.py | 136 | except Exception as e: | CODE |
| MEDIUM | source/Settings/generate_settings.py | 137 | print(f"Error writing output file: {e}") | CODE |
| LOW | source/Settings/lib/settings_cli.py | 103 | except Exception as e: | CODE |
| MEDIUM | source/Settings/lib/settings_cli.py | 104 | print(f"Error loading BSP configuration: {e}") | CODE |
| MEDIUM⚡ | source/Settings/lib/settings_cli.py | 134 | print(f"Error: Settings definition file '{args.definitions}' does not exist.") | CODE |
| LOW⚡ | source/Settings/lib/settings_cli.py | 144 | except Exception as e: | CODE |
| MEDIUM⚡ | source/Settings/lib/settings_cli.py | 145 | print(f"Error loading settings definitions: {e}") | CODE |
| LOW | source/Settings/lib/settings_cli.py | 172 | except Exception as e: | CODE |
| LOW | source/Settings/lib/settings_parser.py | 107 | except Exception as e: | CODE |
| MEDIUM | source/Settings/lib/settings_util.py | 33 | print(f"Error: Model code '{model_code}' is not recognized.") | CODE |
| LOW | source/Settings/lib/settings_util.py | 88 | except Exception as e: | CODE |
| MEDIUM | source/Settings/lib/settings_util.py | 89 | print(f"Error evaluating expression '{expression}' -> '{result_expr}': {e}") | CODE |
| LOW | source/Settings/lib/settings_model.py | 165 | except Exception as e: | CODE |
| MEDIUM | source/Settings/lib/settings_model.py | 166 | print(f"Error loading settings from file: {e}") | CODE |
| LOW | source/Settings/lib/settings_model.py | 226 | except Exception as e: | CODE |
| MEDIUM | source/Settings/lib/settings_model.py | 227 | print(f"Error saving settings to file: {e}") | CODE |
| LOW | scripts/ci/generate_memory_usage_report.py | 249 | except Exception: | CODE |
| LOW | scripts/ci/generate_memory_usage_report.py | 336 | except Exception as exc: # pragma: no cover - CI utility script | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | source/Settings/config_parser.py | 6 | CODE | |
| LOW | source/Settings/generate_settings.py | 13 | CODE | |
| LOW | source/Settings/lib/__init__.py | 13 | CODE | |
| LOW | source/Settings/lib/__init__.py | 13 | CODE | |
| LOW | source/Settings/lib/__init__.py | 14 | CODE | |
| LOW | source/Settings/lib/__init__.py | 14 | CODE | |
| LOW | source/Settings/lib/__init__.py | 15 | CODE | |
| LOW | source/Settings/lib/__init__.py | 15 | CODE | |
| LOW | source/Settings/lib/__init__.py | 16 | CODE | |
| LOW | source/Settings/lib/__init__.py | 17 | CODE | |
| LOW | source/Settings/lib/__init__.py | 17 | CODE | |
| LOW | source/Settings/lib/__init__.py | 17 | CODE | |
| LOW | source/Settings/lib/settings_parser.py | 6 | CODE | |
| LOW | source/Settings/lib/settings_parser.py | 7 | CODE | |
| LOW | source/Settings/lib/settings_model.py | 6 | CODE | |
| LOW | source/Settings/lib/settings_model.py | 9 | CODE | |
| LOW | source/Settings/lib/settings_model.py | 10 | CODE | |
| LOW | source/Settings/lib/settings_model.py | 11 | CODE | |
| LOW | source/Settings/lib/settings_model.py | 11 | CODE | |
| LOW | source/Settings/lib/settings_model.py | 11 | CODE | |
| LOW | source/Settings/lib/settings_model.py | 11 | CODE | |
| LOW | source/Settings/lib/settings_model.py | 15 | CODE | |
| LOW | scripts/ci/generate_memory_usage_report.py | 12 | CODE | |
| LOW | Translations/migrate.py | 4 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | source/Settings/config_parser.py | 159 | def _get_model_specific_blocks(self, content: str) -> List[tuple]: | CODE |
| LOW | source/Settings/test_edit_settings.py | 120 | def test_load_from_nonexistent_binary(self): | CODE |
| LOW | source/Settings/test_edit_settings.py | 154 | def test_save_to_binary_error_handling(self): | CODE |
| LOW | source/Settings/test_generate_settings.py | 62 | def test_load_yaml_and_convert(self): | CODE |
| LOW⚡ | source/Settings/lib/settings_cli.py | 128 | def run_editing_settings_file_cli(): | CODE |
| LOW | scripts/ci/generate_memory_usage_report.py | 239 | def load_language_local_names(translations_dir: pathlib.Path) -> Dict[str, str]: | CODE |
| LOW | Translations/brieflz.py | 48 | def _fn_blz_workmem_size_level(): | CODE |
| LOW | Translations/make_translation_test.py | 8 | def test_get_bytes_from_font_index(self): | CODE |
| LOW | Translations/make_translation_test.py | 35 | def test_no_language_id_collisions(self): | CODE |
| LOW | Translations/make_translation.py | 92 | def validate_langcode_matches_content(filename: str, content: dict) -> None: | CODE |
| LOW | Translations/make_translation.py | 238 | def description_uses_small_font(msg: str) -> bool: | CODE |
| LOW | Translations/make_translation.py | 386 | def convert_letter_counts_to_ranked_symbols_with_forced( | CODE |
| LOW | Translations/make_translation.py | 562 | def get_bytes_from_font_index(index: int) -> bytes: | CODE |
| LOW | Translations/make_translation.py | 773 | def build_symbol_conversion_map(sym_list: List[str]) -> Dict[str, bytes]: | CODE |
| LOW | Translations/make_translation.py | 805 | def make_font_table_named_cpp( | CODE |
| LOW | Translations/make_translation.py | 1247 | def get_translation_common_text( | CODE |
| LOW | Translations/make_translation.py | 1313 | def get_translation_strings_and_indices_text( | CODE |
| LOW | Translations/make_translation.py | 1561 | def get_translation_sanity_checks_text(defs: dict) -> str: | CODE |
| LOW | Translations/font_tables.py | 106 | def get_font_map_latin_extended() -> Dict[str, bytes]: | CODE |
| LOW | Translations/font_tables.py | 498 | def get_small_font_map_ascii_basic() -> Dict[str, bytes]: | CODE |
| LOW | Translations/font_tables.py | 600 | def get_small_font_map_latin_extended() -> Dict[str, bytes]: | CODE |
| LOW | Translations/font_tables.py | 881 | def get_small_font_map_cyrillic() -> Dict[str, bytes]: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | source/Settings/test_generate_settings.py | 105 | # Check if the script executed successfully | COMMENT |
| LOW | source/Settings/generate_settings.py | 53 | # Check if settings definitions file exists | COMMENT |
| LOW⚡ | source/Settings/lib/settings_cli.py | 132 | # Check if settings definitions file exists | COMMENT |
| LOW | source/Settings/lib/settings_cli.py | 185 | # Check if output is hex and we need intelhex module | COMMENT |
| LOW | source/Settings/lib/settings_parser.py | 113 | # Check if any values are still unresolved | COMMENT |
| LOW | source/Settings/lib/settings_model.py | 92 | # Read the file | COMMENT |
| LOW | source/Settings/lib/settings_model.py | 115 | # Check if file size is correct | COMMENT |
| LOW | source/Settings/lib/settings_model.py | 265 | # Check if value is in range | COMMENT |
| LOW | source/Settings/lib/settings_model.py | 293 | # Check if value respects the increment step | COMMENT |
| LOW | source/Settings/lib/settings_model.py | 295 | # Check if value is min_int + n*inc_int | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | source/Settings/test_edit_settings.py | 39 | # Create a temporary YAML file for testing | COMMENT |
| MEDIUM | source/Settings/test_edit_settings.py | 65 | # Create a temporary binary file for testing | COMMENT |
| MEDIUM | source/Settings/test_generate_settings.py | 41 | # Create a simple test YAML file | COMMENT |
| MEDIUM | source/Settings/lib/settings_parser.py | 25 | # Create a dictionary of values to use for resolving expressions | COMMENT |
| MEDIUM | source/Settings/lib/settings_model.py | 211 | # Create a new Intel HEX object | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | source/metadata.py | 50 | CODE | |
| LOW | source/Settings/test_config_parser.py | 9 | CODE | |
| LOW | source/Settings/config_parser.py | 132 | CODE | |
| LOW | source/Settings/config_parser.py | 181 | CODE | |
| LOW | source/Settings/lib/settings_parser.py | 15 | CODE | |
| LOW | source/Settings/lib/settings_model.py | 69 | CODE | |
| LOW | source/Settings/lib/settings_model.py | 230 | CODE | |
| LOW | Translations/make_translation.py | 438 | CODE | |
| LOW | Translations/make_translation.py | 511 | CODE | |
| LOW | Translations/make_translation.py | 1572 | CODE | |
| LOW | Translations/make_translation.py | 1629 | CODE | |
| LOW | Translations/font_tables.py | 1007 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | source/Settings/config_parser.py | 153 | except ValueError: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | …omponents/ble/ble_stack/common/tinycrypt/source/hmac.c | 58 | const uint8_t dummy_key[TC_SHA256_BLOCK_SIZE]; | CODE |
| LOW | …omponents/ble/ble_stack/common/tinycrypt/source/hmac.c | 70 | (void)tc_sha256_update(&dummy_state.hash_state, dummy_key, key_size); | CODE |
| LOW | Translations/brieflz_test.py | 7 | b"Lorem ipsum dolor sit amet, consectetur adipiscing elit. " | CODE |
| LOW | Translations/brieflz_test.py | 7 | b"Lorem ipsum dolor sit amet, consectetur adipiscing elit. " | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | source/Core/brieflz/brieflz_leparse.h | 46 | // Essentially, this improves the worst case for the parsing at a small cost | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | source/Settings/lib/__init__.py | 23 | __all__ = [ | CODE |