Commit c9bb1ee
committed
fix: 堵住 id 注入、修复英文答案空转、让教学漂移可被 CI 检测
三个真缺陷,都不是理论风险:
1. 练习 id 注入。id 直接取自文件名,有两个危险去向:d2x 把它拼进 shell
命令,我们把它写进生成的 TOML([targets.<id>])。带反引号、`]` 或引号
的文件名在任一处都能越界 —— 对社区课程仓库来说,一个恶意 PR 文件名就
足以在任何跑 checker 的人机器上执行命令。
在 discovery 源头做白名单校验并拒绝,而不是在两个下游各自转义:这类
文件名本就是笔误或恶意,与其想办法安全地传递,不如让作者改名。
实测:`99-evil`touch pwned_marker`.cpp` 被拒绝,命令未执行。
2. e2e.sh 把所有英文参考答案静默 SKIP。前缀剥离顺序错了 —— `${sol#en/}`
执行时 sol 已经以 "solutions/" 开头,匹配不到任何东西,是个静默 no-op,
于是每道英文练习都因找不到 solutions/en/... 而跳过。
这正是本脚本头部注释里说要防的那种空转,和旧 CI 一模一样的毛病。
除了修顺序,另加一道防线:pass==0 时直接判失败,杜绝「0 失败」蒙混。
实测修复后 en 也是 51/51 真验证(此前是 0 通过 / 52 跳过)。
3. d2x_assert_eq 的日志分支仍用裸 std::to_string,而上报分支已改用
SFINAE 安全的 show()。std::to_string 没有 std::string / const char* /
scoped enum 的重载,下一个比较字符串或强类型枚举的练习会直接编译失败 ——
show() 存在的意义就是避免这个,却只用了一半。
教学漂移(04-rvalue-references):
C++17 起 prvalue 直接初始化目标(保证复制省略),-fno-elide-constructors
再也无法让 `Object obj = Object();` 产生移动构造。全仓库改按 c++23 编译后,
这节课的核心观测点被静默抹掉。
改成从具名对象 std::move —— 这在任何标准下都必然调用移动构造。更重要的是
补了一条 d2x_assert(move_ctor_calls >= 1):漂移之所以能静默发生,正是因为
从前没有任何断言检查它,输出少一行没人发现。现在它是 CI 可检测的事实。1 parent 8b01ee8 commit c9bb1ee
4 files changed
Lines changed: 59 additions & 8 deletions
File tree
- d2x/buildtools/mcpp
- src
- tests
- dslings/harness/include/d2x/cpp
- solutions/cpp11
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
7 | 11 | | |
8 | 12 | | |
9 | 13 | | |
| |||
108 | 112 | | |
109 | 113 | | |
110 | 114 | | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
111 | 130 | | |
112 | 131 | | |
113 | 132 | | |
| |||
139 | 158 | | |
140 | 159 | | |
141 | 160 | | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
142 | 170 | | |
143 | 171 | | |
144 | 172 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
44 | 44 | | |
45 | 45 | | |
46 | 46 | | |
47 | | - | |
48 | | - | |
49 | | - | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
50 | 55 | | |
51 | 56 | | |
52 | 57 | | |
| |||
71 | 76 | | |
72 | 77 | | |
73 | 78 | | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
74 | 88 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
51 | 51 | | |
52 | 52 | | |
53 | 53 | | |
54 | | - | |
| 54 | + | |
55 | 55 | | |
56 | 56 | | |
57 | | - | |
| 57 | + | |
58 | 58 | | |
59 | 59 | | |
60 | 60 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
13 | 13 | | |
14 | 14 | | |
15 | 15 | | |
| 16 | + | |
16 | 17 | | |
17 | 18 | | |
18 | 19 | | |
| |||
21 | 22 | | |
22 | 23 | | |
23 | 24 | | |
24 | | - | |
| 25 | + | |
25 | 26 | | |
26 | 27 | | |
27 | 28 | | |
28 | 29 | | |
29 | 30 | | |
30 | 31 | | |
31 | 32 | | |
32 | | - | |
33 | | - | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
34 | 40 | | |
35 | 41 | | |
36 | 42 | | |
| |||
43 | 49 | | |
44 | 50 | | |
45 | 51 | | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
46 | 55 | | |
47 | 56 | | |
48 | 57 | | |
| |||
0 commit comments