Open Source Flight Controller Firmware
This report summarizes scanner evidence for betaflight/betaflight, a C project with 11,729 GitHub stars. SynthScan examined 2,137,352 lines of code across 3796 source files, recording 8584 pattern matches distributed across 9 syntactic categories. The legacy adjusted pattern signal is 3.3 (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? 8578 finding(s).
Are imports declared and package/API names verified? 0 finding(s).
Are wrappers, guards, and repeated structures necessary? 37 finding(s).
Which changes need focused human review? 8584 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 8584 distinct pattern matches across 9 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 | lib/test/gtest/inc/gtest/gtest-matchers.h | 1 | // Copyright 2007, Google Inc. | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-matchers.h | 21 | // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-matchers.h | 41 | COMMENT | |
| LOW | lib/test/gtest/inc/gtest/gtest-matchers.h | 61 | 4251 GTEST_MAYBE_5046_ /* class A needs to have dll-interface to be used by | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-matchers.h | 141 | public: | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-matchers.h | 161 | // "is empty" matcher probably only needs to explain what the actual | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-matchers.h | 601 | return os; | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-death-test.h | 1 | // Copyright 2005, Google Inc. | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-death-test.h | 21 | // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-death-test.h | 41 | #define GOOGLETEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_ | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-death-test.h | 61 | // tests. IMPORTANT: This is an internal utility. Using it may break the | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-death-test.h | 81 | // | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-death-test.h | 101 | // | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-death-test.h | 121 | // learn wherever you come from. In the following: 'A' denotes a | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-death-test.h | 141 | // A* matches 0 or many occurrences of A | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-death-test.h | 161 | // simplicity, the current implementation doesn't search the PATH | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-death-test.h | 221 | // since the sideeffects of the call are only visible in opt mode, and not | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-death-test.h | 241 | // // opt-mode has sideeffect visible. | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-death-test.h | 261 | // | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-death-test.h | 281 | // death tests are not supported. Those macros must compile on such systems | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-death-test.h | 301 | // terminator - Must be an empty statement for EXPECT_DEATH_IF_SUPPORTED | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-death-test.h | 321 | GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-spi.h | 1 | // Copyright 2007, Google Inc. | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-spi.h | 21 | // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-spi.h | 61 | }; | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-spi.h | 121 | } // namespace testing | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-spi.h | 181 | } \ | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-spi.h | 201 | // - You cannot stream a failure message to this macro. | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-assertion-result.h | 1 | // Copyright 2005, Google Inc. | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-assertion-result.h | 21 | // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-assertion-result.h | 41 | #include <memory> | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-assertion-result.h | 61 | // This class is useful for two purposes: | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-assertion-result.h | 81 | // Expected: true | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-assertion-result.h | 101 | // } | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-assertion-result.h | 121 | // if ((n % 2) == 0) | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-assertion-result.h | 141 | // This warning is off by default starting in Visual Studio 2019 but can be | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-message.h | 1 | // Copyright 2005, Google Inc. | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-message.h | 21 | // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-message.h | 41 | // to CHANGE WITHOUT NOTICE. Therefore DO NOT DEPEND ON IT in a user | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-message.h | 61 | COMMENT | |
| LOW | lib/test/gtest/inc/gtest/gtest-message.h | 81 | // foo << 1 << " != " << 2; | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-message.h | 121 | // overloads are visible in either the std namespace or the global | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-param-test.h | 1 | // Copyright 2008, Google Inc. | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-param-test.h | 21 | // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-param-test.h | 41 | // parameters without writing multiple copies of the same test. | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-param-test.h | 81 | // Range(begin, end [, step]) - Yields values {begin, begin+step, | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-param-test.h | 101 | COMMENT | |
| LOW | lib/test/gtest/inc/gtest/gtest-param-test.h | 121 | const char* pets[] = {"cat", "dog"}; | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-param-test.h | 141 | // | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-param-test.h | 181 | #include "gtest/internal/gtest-param-util.h" | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-param-test.h | 201 | // } | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-param-test.h | 241 | // | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-param-test.h | 261 | // | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-param-test.h | 281 | // each with parameter values 'a' and 'b': | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-param-test.h | 321 | // For example, this instantiates tests from test suite BarTest each | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-param-test.h | 341 | // Synopsis: | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-param-test.h | 361 | // Combine() allows the user to combine two or more sequences to produce | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-param-test.h | 381 | // | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-param-test.h | 401 | // } | COMMENT |
| LOW | lib/test/gtest/inc/gtest/gtest-param-test.h | 421 | // Example: | COMMENT |
| 8441 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …/Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_jpeg.c | 131 | (#) To control JPEG state you can use the following function: HAL_JPEG_GetState() | CODE |
| MEDIUM | …/Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_ltdc.c | 58 | (#) To control LTDC state you can use the following function: HAL_LTDC_GetState() | CODE |
| MEDIUM | …/Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_dcmi.c | 42 | (#) To control DCMI state you can use the function HAL_DCMI_GetState(). | CODE |
| MEDIUM | …7/Drivers/STM32F7xx_HAL_Driver/Src/stm32f7xx_hal_dsi.c | 41 | (#) To control DSI state you can use the following function: HAL_DSI_GetState() | CODE |
| MEDIUM | …/Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dcmi.c | 42 | (#) To control DCMI state you can use the function HAL_DCMI_GetState(). | CODE |
| MEDIUM | …/Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_ltdc.c | 70 | (#) To control LTDC state you can use the following function: HAL_LTDC_GetState() | CODE |
| MEDIUM | …7/Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dsi.c | 41 | (#) To control DSI state you can use the following function: HAL_DSI_GetState() | CODE |
| MEDIUM | …/Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_jpeg.c | 131 | (#) To control JPEG state you can use the following function: HAL_JPEG_GetState() | CODE |
| MEDIUM | …/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_ltdc.c | 60 | (#) To control LTDC state you can use the following function: HAL_LTDC_GetState() | CODE |
| MEDIUM | …/Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_dcmi.c | 44 | (#) To control DCMI state you can use the function HAL_DCMI_GetState(). | CODE |
| MEDIUM | …Drivers/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_can.c | 52 | (#) To control CAN events you can use one of the following two methods: | CODE |
| MEDIUM | …rivers/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_hash.c | 49 | (#) To control HASH events you can use one of the following wo methods: | CODE |
| MEDIUM | …rivers/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_cryp.c | 36 | (#) To control CRYP events you can use one of the following two methods: | CODE |
| MEDIUM | …Drivers/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_dma.c | 40 | (#) Optionally, if the Circular mode is enabled, you can use the Double buffer mode by configuring | CODE |
| MEDIUM | …Drivers/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_dma.c | 64 | (#) To control DMA events you can use one of the following two methods: | CODE |
| MEDIUM | …Drivers/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_dma.c | 74 | (#) Optionally, if Circular mode and Double Buffer mode are enabled, you can modify | CODE |
| LOW | src/platform/GD32/exti_gd32.c | 124 | // don't forget to match cleanup with config | COMMENT |
| LOW | src/platform/STM32/exti.c | 233 | // don't forget to match cleanup with config | COMMENT |
| LOW | src/platform/APM32/eint_apm32.c | 123 | // don't forget to match cleanup with config | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | src/test/sitl/sitl_harness.py | 953 | except socket.timeout: | CODE |
| HIGH | src/test/sitl/sitl_harness.py | 129 | except socket.timeout: | CODE |
| HIGH | src/test/sitl/sitl_harness.py | 623 | except socket.timeout: | CODE |
| HIGH | src/test/sitl/sitl_harness.py | 1072 | except OSError: | CODE |
| HIGH | src/test/sitl/sitl_harness.py | 1113 | except (TimeoutError, RuntimeError, OSError): | CODE |
| HIGH | src/test/sitl/sitl_harness.py | 842 | except OSError: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | src/test/sitl/sitl_harness.py | 3273 | def scenario_wing_rescue_wind(sitl, rc, fdm): | CODE |
| LOW⚡ | src/test/sitl/sitl_harness.py | 3278 | def scenario_wing_rescue_armed_in_hand(sitl, rc, fdm): | CODE |
| LOW⚡ | src/test/sitl/sitl_harness.py | 3285 | def scenario_wing_rx_loss_rescue(sitl, rc, fdm): | CODE |
| LOW | src/test/sitl/sitl_harness.py | 1315 | def scenario_mission_engage_backwards(sitl, rc, fdm): | CODE |
| LOW | src/test/sitl/sitl_harness.py | 1605 | def scenario_geofence_rth_rxloss(sitl, rc, fdm): | CODE |
| LOW | src/test/sitl/sitl_harness.py | 1687 | def rescue_engagement_asserts(sitl, variant="B"): | CODE |
| LOW | src/test/sitl/sitl_harness.py | 1758 | def scenario_rescue_fast_entry(sitl, rc, fdm, variant="B"): | CODE |
| LOW | src/test/sitl/sitl_harness.py | 1804 | def scenario_rescue_near_home(sitl, rc, fdm, variant="B"): | CODE |
| LOW | src/test/sitl/sitl_harness.py | 1846 | def scenario_rescue_heading_recovery(sitl, rc, fdm, variant="B", drift=False): | CODE |
| LOW | src/test/sitl/sitl_harness.py | 1942 | def scenario_rescue_near_home_no_heading(sitl, rc, fdm, variant="B"): | CODE |
| LOW | src/test/sitl/sitl_harness.py | 2035 | def scenario_rescue_switch_descent(sitl, rc, fdm, variant="B"): | CODE |
| LOW | src/test/sitl/sitl_harness.py | 2090 | def scenario_mission_vert_rate(sitl, rc, fdm): | CODE |
| LOW | src/test/sitl/sitl_harness.py | 2106 | def scenario_mission_face_target(sitl, rc, fdm): | CODE |
| LOW | src/test/sitl/sitl_harness.py | 2135 | def scenario_mission_face_next(sitl, rc, fdm): | CODE |
| LOW | src/test/sitl/sitl_harness.py | 2554 | def scenario_wing_launch_into_althold(sitl, rc, fdm): | CODE |
| LOW | src/test/sitl/sitl_harness.py | 2656 | def scenario_wing_loiter_wind(sitl, rc, fdm): | CODE |
| LOW | src/test/sitl/sitl_harness.py | 2662 | def scenario_wing_loiter_gps_loss(sitl, rc, fdm): | CODE |
| LOW | src/test/sitl/sitl_harness.py | 2701 | def scenario_wing_launch_into_poshold(sitl, rc, fdm): | CODE |
| LOW | src/test/sitl/sitl_harness.py | 3010 | def scenario_wing_autoland_crosswind(sitl, rc, fdm): | CODE |
| LOW | src/test/sitl/sitl_harness.py | 3035 | def scenario_wing_autoland_headwind(sitl, rc, fdm): | CODE |
| LOW | src/test/sitl/sitl_harness.py | 3040 | def scenario_wing_autoland_tailwind_flip(sitl, rc, fdm): | CODE |
| LOW | src/test/sitl/sitl_harness.py | 3098 | def scenario_wing_go_around_stick(sitl, rc, fdm): | CODE |
| LOW | src/test/sitl/sitl_harness.py | 3117 | def scenario_wing_go_around_baro(sitl, rc, fdm): | CODE |
| LOW | src/test/sitl/sitl_harness.py | 3137 | def scenario_wing_go_around_gps(sitl, rc, fdm): | CODE |
| LOW | src/test/sitl/sitl_harness.py | 3173 | def scenario_wing_mission_land(sitl, rc, fdm): | CODE |
| LOW | src/test/sitl/sitl_harness.py | 3310 | def scenario_wing_rx_loss_continue(sitl, rc, fdm): | CODE |
| LOW | src/test/sitl/sitl_harness.py | 3362 | def scenario_wing_rx_loss_land(sitl, rc, fdm): | CODE |
| LOW | src/test/sitl/sitl_harness.py | 3392 | def scenario_wing_rescue_gps_loss(sitl, rc, fdm): | CODE |
| LOW | src/test/sitl/sitl_harness.py | 3513 | def scenario_wing_descent_low_ground(sitl, rc, fdm): | CODE |
| LOW | src/test/sitl/sitl_harness.py | 3534 | def scenario_wing_descent_high_ground(sitl, rc, fdm, sloped=False): | CODE |
| LOW | src/test/sitl/sitl_harness.py | 3547 | def scenario_wing_descent_high_slope(sitl, rc, fdm): | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | lib/test/gtest/inc/gtest/gtest-death-test.h | 152 | // This implementation is *not* meant to be as highly tuned or robust | COMMENT |
| MEDIUM | lib/test/gtest/inc/gtest/gtest-death-test.h | 224 | // In practice, this can be used to test functions that utilize the | COMMENT |
| MEDIUM | src/platform/STM32/sdio_h5xx.c | 243 | // Setting all the SDIO pins to high for a short time results in more robust initialisation. | COMMENT |
| MEDIUM | src/platform/STM32/sdio_h7xx.c | 239 | // Setting all the SDIO pins to high for a short time results in more robust initialisation. | COMMENT |
| MEDIUM | src/platform/STM32/sdio_n6xx.c | 307 | // Setting all the SDIO pins to high for a short time results in more robust initialisation. | COMMENT |
| MEDIUM | src/platform/X32/sdio_x32.c | 273 | // Setting all the SDIO pins to high for a short time results in more robust initialisation. | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | src/platform/STM32/spa06_i3c_probe.c | 219 | // Step 0: input + pull-up. Both lines should read 1. | COMMENT |
| LOW⚡ | src/platform/STM32/spa06_i3c_probe.c | 228 | // Step 1: floating input. If the bus has an external pull-up the line | COMMENT |
| LOW⚡ | src/platform/STM32/spa06_i3c_probe.c | 237 | // Step 2: drive SCL (PC10) LOW as open-drain output, SDA stays floating. | COMMENT |
| LOW | src/platform/STM32/spa06_i3c_probe.c | 248 | // Step 3: drive SDA (PC11) LOW open-drain. | COMMENT |
| LOW⚡ | src/main/drivers/compass/compass_qmc5883.c | 195 | // Step 1: Write special XYZ sign configuration value to register 0x29 | COMMENT |
| LOW⚡ | src/main/drivers/compass/compass_qmc5883.c | 197 | // Step 2: Configure CONF1 register with continuous mode, 100Hz ODR, 8G range, and OSR1=8 | COMMENT |
| LOW⚡ | src/main/drivers/compass/compass_qmc5883.c | 199 | // Step 3: Configure CONF2 register with OSR2=8 oversampling settings | COMMENT |
| LOW | src/main/drivers/rx/rx_sx1280.c | 857 | // Next we need to check if we need to FHSS and then do so if needed | COMMENT |
| LOW | src/main/cli/cli.c | 2766 | // Actually, we need to check if the negated value would be < INT32_MIN | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW⚡ | src/platform/STM32/spa06_i3c_probe.c | 219 | // Step 0: input + pull-up. Both lines should read 1. | COMMENT |
| LOW⚡ | src/platform/STM32/spa06_i3c_probe.c | 228 | // Step 1: floating input. If the bus has an external pull-up the line | COMMENT |
| LOW⚡ | src/platform/STM32/spa06_i3c_probe.c | 237 | // Step 2: drive SCL (PC10) LOW as open-drain output, SDA stays floating. | COMMENT |
| LOW | src/platform/STM32/spa06_i3c_probe.c | 248 | // Step 3: drive SDA (PC11) LOW open-drain. | COMMENT |
| LOW⚡ | src/main/drivers/compass/compass_qmc5883.c | 195 | // Step 1: Write special XYZ sign configuration value to register 0x29 | COMMENT |
| LOW⚡ | src/main/drivers/compass/compass_qmc5883.c | 197 | // Step 2: Configure CONF1 register with continuous mode, 100Hz ODR, 8G range, and OSR1=8 | COMMENT |
| LOW⚡ | src/main/drivers/compass/compass_qmc5883.c | 199 | // Step 3: Configure CONF2 register with OSR2=8 oversampling settings | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/platform/PICO/bus_spi_pico.c | 337 | //TODO: implement | COMMENT |
| LOW | src/main/msp/msp_protocol_v2_common.h | 26 | // TODO: implement new, extensible rangefinder protocol | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | src/test/sitl/sitl_harness.py | 2773 | CODE | |
| LOW | src/test/sitl/sitl_harness.py | 3483 | CODE | |
| LOW | src/test/sitl/sitl_harness.py | 121 | CODE |