Fluidsynth / 源码审计2026 · 10 · 25 新加坡时间
代码质量 · 覆盖率 · 可复现问题

把没被测试照到的地方,逐个跑一遍。

我从高圈复杂度、低覆盖率的音频与格式解析路径开始,构造输入重现问题,再给每个问题补上回归用例。初次审计截至 2026-10-25 10:00;本页已更新本轮复审和根因补修结果。✦ 标记本轮更新条目。

50成立缺陷;F26 基线归因撤回
71 / 71本轮重新构建常规测试
69 / 71本轮 sanitizer;2 项已披露泄漏
61.5%原审计行覆盖率;本轮未重测

直接筛问题

按关键词、输入类型、问题种类和严重程度缩小列表

已复现的缺陷

问题清单

51 条记录(50 项成立,1 条撤回)

没有找到符合条件的问题。试试清空筛选或换一个关键词。
✦ 复审更新

核对基线,补齐根因。

3 个 sub agent 与主审逐项核对 51 个编号;本轮更新 20 条,均以 ✦ 标记。F26 在声明基线已有正确行为,撤回其基线缺陷归因,保留编号便于追踪。

  • 根因补修:F01 的等待规则状态、F08 的 MTS 保留字、F17/F34 的根音边界、F35 的内部 tick 表示、F41 的零步长结束边界、F42 的未知查询及 F47 的条件参数提交;F12/F13 保留原 NULL 清除契约。
  • 纠正 F06 协议名、F16 输入合法性、F19 固定力度语义、F21 分配数字、F29 消息合规性;调整 F02、F10、F12、F16、F19、F30 的排序分。
  • 独立普通构建 71/71 通过;clang ASan / UBSan / float-cast-overflow / LSan 未过滤运行 69/71 通过。失败仅为原已披露的 test_sfont_unloading(timer-thread handle)和 test_shell_server_auto_port(shell mutex)泄漏,本轮新增与修改的根因回归均通过。启用 SDL3、DLS、多核线程,关闭 libsndfile 及部分宿主音频后端;测试数量与原配置不同。
  • 声明基线 c7ba7b49;本轮工作区 HEAD a1e76704 加未提交补丁,分别核对。全部编号已检查源码、原始差异与测试,未重新运行全部 50 项基线 sanitizer 复现。
怎么审计

先找盲区,再证实问题。

圈复杂度用来找分支多的代码;覆盖率用来找现有测试没走到的分支。两者只是线索。复审保留 50 项成立缺陷,并单独保留 F26 的基线归因撤回记录;历史覆盖率、fuzz 和 Mull 未对本轮补丁重测。

  • 对 upstream/master c7ba7b49 做审计;与 24 个未合并的 fix 分支比对,排除已在那些分支处理的问题。
  • 用 Lizard 计算复杂度、gcovr 生成覆盖率;源码覆盖为 61.5% 行、45.4% 分支、67.6% 函数。高复杂、低覆盖函数优先检查。
  • 用 ASan、UBSan、LSan 做定点重现;libFuzzer 跑 MIDI、DLS、SF2 解析器,累计分别执行 428,395、471,995、195,433 次。另以有效 MTS、GS、XG 种子测试 SysEx 入口 181 秒,产生 17,525,710 个字节输入(每个输入各跑普通与试运行两条路径),没有发现崩溃。最近一轮解析器 fuzz 分别执行 91,203、131,129、65,361 次,没有发现崩溃。用 Mull 做源码级变异测试。公开合成器 API 状态 fuzz 此前跑过 164,418 个输入;之后在 F44 的精简回归序列之外,修复版又跑了 26,963,447 个输入,没有发现新崩溃。此前 11,175 与 21,483 个输入各重现并修复一个数值边界问题。
  • 原审计测试:常规 74/74;覆盖率构建 71/71;ASan / UBSan / LSan 排除两个已披露泄漏用例后 72/72。这些是历史结果,本轮测试配置和结果单独列出。
  • Mull 变异测试按源码文件筛选,得分反映本次选定回归测试能杀死的变异:MIDI parser 57%,MIDI router 87%(13/106 个变异存活),DLS parser 78%(本轮杀死 210/269 个变异),synth 31%,voice 55%(test_sfont_keynum_bounds:50/90),sequencer 50%(4/8 个存活,均为未覆盖的清理路径空值判断),单音连奏 50%(6/12 个存活)。F51 的 PTBL 分配回归是在原 DLS 变异运行之后加入;单独对该测试运行时,DLS 源文件范围内 92 个变异杀死 30 个(32%)。它仍不是 F51 的单项分数;DLS 解析器 78% 分数来自覆盖更广的另一组测试。幸存变异仍需后续测试补强。