Skip to content

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

Merged
da-liii merged 2 commits into
mainfrom
da/0145/listdir-type-check
Sep 8, 2026
Merged

da-liii merged 2 commits into
mainfrom
da/0145/listdir-type-check

Conversation

@da-liii

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

Copy link
Copy Markdown
Contributor

问题

(g_listdir 99) 会让 bin/gf abort(SIGABRT, exit 134),见 demo/crash/c11-g_listdir-integer.scm。

根因:src/liii_os.cpp 的 f_listdir 直接 s7_string(s7_car(args)),垃圾/空指针进入 std::string 构造,抛出未捕获的 std::logic_error。同一函数内 path_s[path_N - 1] 在空字符串参数时还存在越界读取(UB)。

修复

沿用 #963(devel/0142.md)的模式,防御放在 C++ 层:

  • f_listdir 入口检查 s7_is_string,非字符串返回 s7_wrong_type_arg_error
  • last_ch 改为仅在 path_N > 0 时取末字符,消除空字符串 UB

(liii os) 公开包装 listdir 已有检查,本修复使根环境直接调用 g_listdir 的代码也受保护。

测试

  • tests/liii/os/listdir-test.scm 增加 3 条 C 层入口回归测试。TDD:修复前运行测试文件本身即 abort(exit 134),修复后 7/7 通过
  • (g_listdir 99) 由 SIGABRT 变为干净的 wrong-type-arg 报错(exit 255),验证后按惯例移除 demo/crash/c11-g_listdir-integer.scm 并更新 README

备注

@da-liii
da-liii force-pushed the da/0145/listdir-type-check branch from 28b8ed3 to 1a8dbc7 Compare September 8, 2026 00:43
@da-liii
da-liii merged commit 045de5d into main Sep 8, 2026
5 checks passed
@da-liii
da-liii deleted the da/0145/listdir-type-check branch September 8, 2026 00:49
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