Skip to content

[0143] C++ 层为 which 增加参数类型检查,修复非字符串参数导致的崩溃 - #964

Merged
da-liii merged 4 commits into
mainfrom
da/0143/which-type-check
Sep 8, 2026
Merged

da-liii merged 4 commits into
mainfrom
da/0143/which-type-check

Conversation

@da-liii

@da-liii da-liii commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

问题

(import (liii sys)) (which 123) 会让 bin/gf abort(SIGABRT, exit 134,C++ 未捕获异常 std::logic_error: basic_string construction from null)。

根因:src/goldfish.hpp 的 f_which 直接 s7_string(s7_car(args)),垃圾/空指针传入 std::string 构造函数。可选的第 2 参数 path 同样未检查((g_which "ls" 123) 也会崩)。

修复

沿用 #963(devel/0142.md)的模式,防御放在 C++ 层,并把同文件同模式的两个入口一并加固:

  • f_which:cmd、可选 path 均检查 s7_is_string
  • f_delete_file(delete-file 的底层)
  • f_get_environment_variable(get-environment-variable 的底层)

测试

  • 新增 tests/liii/sys/which-test.scm(10 条):which 正常功能、公开入口与 C 层入口 g_which 的参数类型(含可选 path)、同文件两个入口的加固检查。TDD:修复前运行测试文件本身即 abort,修复后 10/10 通过
  • bin/gf demo/crash/h02-which-public-integer.scm 由 SIGABRT 变为干净的 wrong-type-arg 报错,验证后按惯例移除该片段
  • 回归检查:sys-test / process-context-test / boot-test / os-call-test / path-test / tools/help 测试全部通过

备注

  • 任务文档:devel/0143.md
  • 剩余未修复入口(g_rename、g_listdir、base64 长度参数及 liii_os/liii_path/liii_hashlib 的同类静默垃圾入口)见 demo/crash/README.md,建议后续批量任务处理

@da-liii
da-liii merged commit 4aef448 into main Sep 8, 2026
5 checks passed
@da-liii
da-liii deleted the da/0143/which-type-check branch September 8, 2026 00:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant