已开启
[Issue] LLVM 检测结果未包含实际版本:Windows 返回路径、Linux 返回包名 #53
KarliosQu创建于  9月21日
KarliosQu成员
9月21日 创建

问题概述

llvm-toolchain 的存在性检测成功后,Forge 没有获得实际 LLVM 版本:Windows 将 where 输出的文件路径列表填入版本字段,Linux 将 dpkg -s 输出的首行 Package: clang 填入版本字段。

2026-09-21 在当前 main 81d0f187faf6b33718c7f2e45de1492efa764364(项目版本 1.1.0)确认;最早引入版本未追溯。影响 status 及 install 预检查的版本展示,用户无法据此确认安装的是哪个 LLVM 版本。

本次使用隔离的可控替身验证检测链路:替身 clang --version / llvm-config --version 输出 18.1.8;未安装真实 LLVM,不将此结果表述为真实 LLVM 安装失败。两个平台均返回 installed=true,命令退出码均为 0。

影响范围

项目 内容
执行模式 □ plan ☑ install ☑ status □ doctor
受影响的工具、资源或目标版本 llvm-toolchain;测试基线版本 18.1.8
安装后端 □ cargo □ archive □ apt-mirror □ 托管 Cargo ☑ 其他(APT / winget 的检测配置)
影响程度 □ 阻断 □ 严重 □ 一般 ☑ 轻微
临时规避办法 单独执行 clang --version 或 llvm-config --version 核对版本

复现步骤

以下 Linux 最小复现只模拟工具和包查询输出,不修改系统包或用户配置。FORGE 替换为上述提交编译出的二进制路径。

FORGE=/absolute/path/to/bot-forge
root=$(mktemp -d)
mkdir -p "$root/bin" "$root/home"
cat > "$root/bin/dpkg" <<'SH'
#!/bin/sh
[ "$1" = "-s" ] || exit 2
shift
for pkg in "$@"; do
  printf 'Package: %s\nStatus: install ok installed\nVersion: 18.1.8\n\n' "$pkg"
done
SH
cat > "$root/bin/clang" <<'SH'
#!/bin/sh
printf 'clang version 18.1.8\n'
SH
cat > "$root/bin/llvm-config" <<'SH'
#!/bin/sh
printf '18.1.8\n'
SH
chmod +x "$root/bin/dpkg" "$root/bin/clang" "$root/bin/llvm-config"
cat > "$root/probe.toml" <<'TOML'
catalog = "rust-dev"
[profiles.llvm-test]
components = ["llvm-toolchain"]
TOML

"$root/bin/clang" --version
"$root/bin/llvm-config" --version
env PATH="$root/bin:$PATH" HOME="$root/home" BOT_FORGE_HOME="$root/forge" \
  "$FORGE" status llvm-test --config "$root/probe.toml" --format json
echo "Exit: $?"
env PATH="$root/bin:$PATH" HOME="$root/home" BOT_FORGE_HOME="$root/forge" \
  "$FORGE" install llvm-test --config "$root/probe.toml"
echo "Exit: $?"

Windows 对照:在隔离 PATH 下提供 clang.exe、llvm-nm.exe、llvm-config.exe 以及用于存在性检查的 libclang.dll 占位文件;三个 exe 为可控替身,版本查询输出 18.1.8。保持内置 Windows 检测配置不变,通过系统 where.exe 进行真实路径查询,再执行同样的 status / install 命令。没有运行 winget 或真实 DLL。

预期结果

存在性检查通过后,版本字段应包含实际查询得到的 LLVM 版本(本用例为 18.1.8)。如果配置仅提供存在性检查、无法确定版本,应明确显示版本未知,而不是把路径或包描述当作版本。

实际结果

Linux 基线和 Forge 输出:

$ clang --version
clang version 18.1.8
$ llvm-config --version
18.1.8

status --format json 中的工具对象:
{
  "name": "llvm-toolchain",
  "installed": true,
  "version": "Package: clang",
  "required_version": null,
  "outdated": false,
  "installable": true
}
Exit: 0

Windows 的对应字段(路径以 <TEST_ROOT> 代替):

"installed": true
"version": "<TEST_ROOT>\\bin\\clang.exe; <TEST_ROOT>\\bin\\llvm-nm.exe; <TEST_ROOT>\\bin\\llvm-config.exe; <TEST_ROOT>\\bin\\libclang.dll"
"required_version": null
"outdated": false
Exit: 0

两平台安装预检查也显示相同的路径/包描述,并正常跳过已安装组件,退出 0;没有发生安装动作。

代码依据:内置 catalog 的 Linux 检测是 dpkg -s clang llvm libclang-dev binutils;Windows 是四次 where 查询,没有读取版本的命令。src/execution/install.rs 的 run_typed_check 保留各命令首行,tool_status_from_detection 再将该结果用作 version。因此 dpkg 后面的 Version 字段未参与版本展示,Windows 的结果则始终是路径。建议保留必要的存在性检查,另外通过版本命令获取版本,并将路径与版本分开表达。

本 issue 不声称默认配置存在版本升级判定错误:内置 llvm-toolchain 没有配置 required_version,本次也未将自定义版本约束场景作为证据。

运行环境与供应信息

项目 内容
BotForge 版本或提交号 1.1.0 / 81d0f187faf6b33718c7f2e45de1492efa764364
操作系统与架构 Windows x86_64;WSL Ubuntu-24.04 x86_64
Shell PowerShell;bash
配置来源 内置 rust-dev catalog + 仅选择 llvm-toolchain 的测试 profile
软件仓库 / 镜像 本次无下载;没有执行 APT/winget 安装
校验和清单 catalogs/SHA256SUMS:3fd33f65e81c6a5ab99e91cd7d8945ab5e8261efbab64c9c7c47318cb8d1d394
相关工具及版本 可控 LLVM 替身输出 18.1.8;Windows 使用真实 where.exe;Linux dpkg 查询使用替身

安全、性能与恢复证据

附件与提交确认

likedislike