fix: staticcheck 24 条存量全部清零(含 4 个真实缺陷)

staticcheck 门接入时把存量设为基线 24 条,本次全部清掉,基线改为 0。

## 生产代码里的真实缺陷(4 个)

### ① memory/fusion.go —— BFS 的 depth 参数形同虚设

    for d := 1; d <= depth; d++ {
        neighbors, _ := g.NeighbourBlocks(seed.BlockID)   // ← 永远是 seed
        ...
        break                                             // ← 只跑一轮
    }

三处叠加:循环体末尾无条件 `break`;每层传的还是 `seed.BlockID`;
于是 depth=2 与 depth=3 召回结果**完全一样**。

staticcheck SA4008("变量在循环条件里从不改变")正是从这里报出来的 ——
它看出来 `d` 除了打分没有参与寻址。

改成真正的逐层 BFS(frontier 推进到上一层新发现的节点)。实测:

    depth=1 → 2 个  [节点0 节点1]
    depth=2 → 3 个  [节点0 节点1 节点2]      ← 修复前停在这里
    depth=3 → 4 个  [节点0 节点1 节点2 节点3]

补判据 `TestBFS召回_层深真实生效`:必须用**链**(n0-n1-n2-n3),
星型在 depth=1 就能召回全部叶子、断不出有没有走深。
变异(改回单层)⇒ 实测红:`★ depth=2 召回 2 个,期望 3`。

### ② nlp/extractor.go —— subjRels/objRels 只写不读

两个切片被 append 了 4 处,但**从未被读取**。三元组的关系类型来自
`relLabel := result.Tokens[vi]`,置信度来自 `result.DepRels[si]`,
与这两个切片无关。删除。

### ③ plugins/cmd/plugin.go —— 配置解析失败会把上限写成 0

    if n, err := fmt.Sscanf(s, "%d", &p.maxOutput); err == nil && n > 0 {
    }   // ← 空分支

直接 Sscanf 到 &p.maxOutput:解析失败时它可能已被写成 0 或部分值,
而空分支无法回滚 ⇒ 配置写错一个字符就把输出上限变成 0
(下游 `maxLen := p.maxOutput` 直接拿它算截断长度)。
改为解析到临时变量、失败时保持默认并记日志。

### ④ cmd/homed/bootstrap.go —— 空的 else 分支

`if err != nil { log } else { }` —— 删掉 else。

## 测试判据里的真实缺陷(3 个)

### ⑤ stop_semantics_test —— 短路求值让第二次调用从不执行

    if !a.sched.consumeCancel() || !a.sched.consumeCancel()

第一次返回 true 时第二次**根本不会执行**,于是"两条配额都可消费"
这条断言实际只测了一次。拆成两次独立调用(两处同型)。

### ⑥ seq/store_test —— 永假断言

    if maxCallDepth != maxCallDepth { t.Fatal("maxCallDepth 不稳定") }

自己跟自己比,从诞生起就不可能失败。改成显式读两次比较。

### ⑦ pluginhost/catalog_test —— typed-nil 守卫永假

    var nb *kstate.SyncBus
    var iface kstate.SyncState = nb
    if iface == nil { t.Skip(...) }        // ← 恒 false

把 typed-nil 装进接口后,接口的 (type, value) 二元组都不为 nil。
这道前置守卫**从未生效** —— 而这正是该判据要演示的陷阱本身。
改用 `reflect.ValueOf(iface).IsNil()`。

## 其余(写法/冗余,无行为变化)

  agent.go / context.go / toolresult_store_test / apply_regression_test
    空 if 块(注释移到真实分支上方)

  codec_chunkfast_golden_test   未使用的三个返回值 + 空 if
  scheduler_critical/stack_test  `if _, _ = f(); true { }` → 直接调用
  overflow_test / upgrade_test   变量被整体覆盖,首次赋值未使用
  dense_test                     m[string(x)] 替代临时变量
  lex_rules_test                 range over string 而非 []rune(string)

## 验证

    staticcheck -checks 'SA4*,SA5*,SA6*,SA9*'   0 条(基线 24 → 0)
    go build ./...                              PASS
    go vet ./...                                PASS
    gofmt -l                                    干净
    go test ./... -count=1                      65 包全过,0 FAIL
    干净检出(worktree)                         build + memory/nlp/core 全绿
This commit is contained in:
JianFeeeee
2026-11-04 19:49:21 +08:00
parent 77e38360a8
commit 892247946a
20 changed files with 191 additions and 78 deletions

View File

@ -4,6 +4,7 @@ import (
"bytes"
"context"
"fmt"
"log"
"os"
"os/exec"
"runtime"
@ -96,7 +97,18 @@ func (p *Plugin) Start(s *sdk.PluginSDK) error {
p.maxOutput = 32000
if v, _ := s.Settings().Get("max_output_bytes"); v != nil {
if s, ok := v.(string); ok && s != "" {
if n, err := fmt.Sscanf(s, "%d", &p.maxOutput); err == nil && n > 0 {
// ★ 必须解析到临时变量再赋回(2026-11-04 修 staticcheck SA9003)。
//
// 原写法直接 Sscanf 到 &p.maxOutput 且分支体为空:
// · 解析成功 → 值已写入,分支"什么都不做"看起来对
// · 解析失败 → Sscanf 可能已把 maxOutput 写成 0 或部分值,
// 而空分支无法回滚 ⇒ 配置写错一个字符就把上限变成 0
// (下游 maxLen := p.maxOutput 直接拿它算截断长度)
n := 0
if parsed, err := fmt.Sscanf(s, "%d", &n); err != nil || parsed != 1 || n <= 0 {
log.Printf("[cmd] max_output_bytes=%q 非法(期望正整数),保持默认 %d", s, p.maxOutput)
} else {
p.maxOutput = n
}
}
}

View File

@ -223,7 +223,10 @@ func TestExtractFailureRollsBack(t *testing.T) {
// 畸形包在 validatePackage 层就拒绝,未达 extract——模拟 extract 失败:
// 直接注入非法平台文件触发 extractPackage 错误
bad := buildHmap(t, "rollback", "9.9.9")
// ★ 2026-11-04:原先这里先 `bad := buildHmap(...)` 再整体覆盖成
// 篡改后的字节 —— 第一次构造未被使用(staticcheck SA4006)。
// 本用例要的就是**篡改版**,直接构造它。
//
// 篡改使 extract 失败:附加一个越界路径
var rb bytes.Buffer
zw2 := zip.NewWriter(&rb)
@ -233,7 +236,7 @@ func TestExtractFailureRollsBack(t *testing.T) {
mData, _ := json.Marshal(map[string]interface{}{"name": "rollback", "version": "9.9.9", "entry": "plugin.bin"})
mf.Write(mData)
zw2.Close()
bad = rb.Bytes()
bad := rb.Bytes()
r, _ := p.installFromData(bad, true)
m := r.(map[string]interface{})

View File

@ -140,9 +140,14 @@ func TestMaxCallDepthIsConstant(t *testing.T) {
if maxCallDepth <= 0 {
t.Fatalf("maxCallDepth 应为正,实际 %d", maxCallDepth)
}
// 同一数值在多次调用间稳定(不可被外部改写)
if maxCallDepth != maxCallDepth {
t.Fatal("maxCallDepth 不稳定")
// ★ 2026-11-04:原先写的是 `if maxCallDepth != maxCallDepth` —— 永假,
// 这条断言从诞生起就不可能失败(staticcheck SA4000)。
//
// 意图是"同一数值在多次调用间稳定(不可被外部改写)"。真正该测的是
// **读取两次得到同一个值**,于是改成显式取两次比较。
v1, v2 := maxCallDepth, maxCallDepth
if v1 != v2 {
t.Fatalf("maxCallDepth 读取不稳定:%d vs %d", v1, v2)
}
}