Repository navigation
v0.9.2
[0.9.2] - 2026-10-10
空运行检测器跳过(性能 P0-5)
sizeof_misuse/unchecked_return空运行跳过:启动前轻量预扫是否有触发形态(sizeof(标识符)处于 size 上下文 / 存在 unchecked-return API 或分配器调用),无则跳过昂贵的跨文件 typedef 表与 passthrough 修复点。预扫出错时 fail-open 照常运行完整检测,不引入漏报。
integer-overflow 截断累加器误报(CWE-190)
unsigned_sub_underflow截断累加器抑制(P1-2):size - count中count若只由截断式格式化包装器累加(count += snprintf_truncated_s(...)/count = count + sprintf_s(...)),则按契约count不超过size,该减法不会下溢,不再发unsigned_sub_underflow。仅匹配*truncated*(含 printf/sprintf)与精确sprintf_s/vsprintf_s,snprintf/snprintf_s(返回值可超界)不匹配,保持保守。回归夹具:tc128_int_overflow_snprintf_accumulator.c。
race-condition 锁封装函数识别(CWE-362)
- 纯 lock/unlock 封装函数对(P1-4):
xxx_lock()(函数体仅pthread_mutex_lock(&g_mutex))与xxx_unlock()视为与直接原语等价,位于两者之间的共享状态写不再被误报为 shared_data_race。仅当函数体只有 lock(或只有 unlock)调用、无其它调用时才识别为纯封装,关键段 helper 不算。回归夹具:tc129_race_lock_wrapper.c。
resource-leak 自动确认误报修复(CWE-404)
生产环境反馈 0.9.2 的 resource-leak 自动确认(auto-confirmed)包含大量确定性误报,是"几乎无法使用"的主要原因。本轮针对两大非泄漏模式去掉自动确认(仍保留为 suspected 交由 AI 研判,不丢召回):
- 锁配对(P0-1):
xxx_lock()内pthread_mutex_lock(&g_mutex)、同文件xxx_unlock()内pthread_mutex_unlock(&g_mutex)的标准封装函数对,以及pthread_rwlock_rdlock/wrlock配对,不再标记definite(跨函数解锁在本函数内不可证,不能 auto-confirm)。 - 全局/静态变量持有(P0-2):
g_handler = iconv_open(...)、g_handle = dlopen(...)、g_fd = epoll_create(...)及函数内static局部缓存等进程生命周期资源持有,不再标记definite。findLocalVarsFrom同步将static局部视为非局部(逃逸),消除 memory-leak / resource-leak 两侧的静态缓存误报。
divide-by-zero 跨文件常量除数(CWE-369)
- 跨文件
#define常量解析:x / NLOG_SECOND_PER_MINUTE这类除数宏定义在.h头文件时,此前每文件常量表看不到、被误报为"可能为零"。现改用buildGlobalConstants合并所有已索引文件(含头文件)的编译期常量(冲突值保守地降为"不确定"),头文件里的非零常量除数像字面量一样被丢弃。回归夹具:tc127_divide_by_zero_crossconst/。
生产内存分配模式识别(对齐 docs/req_内存分配释放典型性优化.md)
- 第三方 SDK 分配/释放名进入精确集合:
VOS_Malloc_F/VOS_Free_F、HpeMemAlloc/HpeMemFree、VOS_Mem_Allock_F/VOS_Mem_ReAllock_F/VOS_MemFree_F加入BuiltinAllocators/BuiltinDeallocators,使 null-deref 确认层与 double-free / UAF / unchecked-return 检测器像对待malloc/free一样精确对待这些跨仓库 SDK 宏,而非依赖 fail-open 命名启发式。 - "封装成函数"包装器识别(新增能力):识别"函数体返回分配器结果"的包装器(
p = malloc(n); if(!p) return NULL; memset_s(...); return p;),即使包装器名不含alloc/malloc子串,调用方的未释放结果也会被检出为泄漏(memory-leak)。这是 40+ 个仓库各自命名、但都"判空 + memset_s 初始化后返回指针"的共性形态。 - 回归夹具:
tc123_resleak_lock_pair.c、tc124_resleak_global_hold.c、tc125_prod_alloc_macros.c、tc126_passthrough_alloc_wrapper.c。
AI 复核 auto-confirmed 结果(新能力)
- 新增
secguard review-autoconfirmed命令:对 sgre 判定为auto-confirmed的 finding 做一次独立 AI 复核,降低 pipeline 自动确认的误报、恢复 AI 研判价值。支持--scan-id/--type/--limit/--dry-run/--status/--output-json。 - 复核结论复用现有
findings.review_status第二遍字段:false_positive映射为 dismissed(真正过滤)、ai_confirmed映射 confirmed、needs_more_evidence保守保留原 confirmed,并在result.sarif以review_status属性暴露供观测。 review_error(复核调用失败)只写日志、不落库、不进result.sarif:finding 保持未复核并在下次运行时自然重试,避免"复核失败却仍标 confirmed"误导用户。- 完整复核审计(supporting/contradicting/missing 证据数组、模型/provider、prompt/schema 版本、源码 revision、confidence、耗时)合并进
properties.review,与auto_confirm_evidence共存,不污染原始机器结论。 - 扫描时记录源码 revision(
scan_runs.source_revision),复核时校验 revision 一致性;payload 修复绝对路径解析与路径穿越防护。 - 新增
[ai_review]配置:provider/model/endpoint/api_key_env/timeout_ms/max_retries/budget_usd/cost_per_call_usd/prompt_version/schema_version。