Commit 42d0cee
committed
fix: cmd 的转义只加在真正没被保护的那个字符上;示例补 <cstddef>
Windows e2e 两红,Linux examples 一红,两条都是这一轮自己引入的。
## 一、把引号也一起转义,打断了每一次包获取
上一条提交的做法是:先按子进程的规则引用,再给**每个 cmd 元字符,包括引号本身**
前缀 `^`。理由在纸面上成立 —— 没有裸引号,cmd 就从不进入引用区,于是每个元字符都是
被转义而不是被引用的。
**Windows CI 的读数是:每一次 `install_packages` 都退 1**,包括那两次 JSON 里一个
元字符都没有的(`compat:widget@1.38.1`、`mcpplibs:tpl-demo@1.0.0`)。而这个 job 里
只有那两次调用,也就是**走到这条路的每一次都失败了**。
改成保守的那条规则:引用之后,**按 cmd 看到的引用状态**走一遍(每个 `"` 都翻转它,
因为 cmd 不认 MSVCRT 的 `\"`),只给**落在引用区之外**的元字符加 `^`。引用区里的元
字符本来就是惰性的,而 `^` 在那里是个普通字符。
于是「没有东西要转义」的载荷输出与 `quote_windows` **逐字节相同** —— 那是绝大多数
载荷,也正是被打断的那些。而 `>=2026.3` 里那个 `>` 只多一个 `^`。
判据补了一条:`NothingToEscapeMeansByteIdenticalToPlainQuoting`,直接拿 CI 里失败的
那两个 JSON 当输入。cmd 的模拟器也补上了「`^` 在引用区内是普通字符」这一半 —— 只建
模前一半,它会接受一个 cmd 并不接受的形状。
## 二、示例:`std::size_t` 要 `#include <cstddef>`
`src/cpu/render.cpp` 在 libstdc++ 下编得过、在 libc++ 下编不过:
src/cpu/render.cpp:56:52: error: no type named 'size_t' in namespace 'std'
标准头有权带进它需要的其他头,而带进哪些因实现而异。本地默认工具链是 gcc,CI 那一步
用的是 llvm —— **同一台机器上的两个答案**。点名一个类型的翻译单元必须包含声明它的那个
头,不管上一个实现顺手给了什么。
`src/vulkan/render.cpp` 同样补上(它此前靠 `<vulkan/vulkan.h>` 间接得到)。
可迁移的:**本地验示例要用 CI 那一步用的工具链**(`mcpp build --toolchain llvm@…`),
否则验的是另一个标准库。1 parent 25a51ac commit 42d0cee
4 files changed
Lines changed: 63 additions & 14 deletions
File tree
- examples/10-graphics/offscreen/src
- cpu
- vulkan
- modules/platform/src
- tests/unit
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
7 | 7 | | |
8 | 8 | | |
9 | 9 | | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
10 | 21 | | |
11 | 22 | | |
12 | 23 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
19 | 19 | | |
20 | 20 | | |
21 | 21 | | |
| 22 | + | |
22 | 23 | | |
23 | 24 | | |
24 | 25 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
41 | 41 | | |
42 | 42 | | |
43 | 43 | | |
44 | | - | |
45 | | - | |
46 | | - | |
47 | | - | |
48 | | - | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
49 | 58 | | |
50 | 59 | | |
51 | 60 | | |
| |||
101 | 110 | | |
102 | 111 | | |
103 | 112 | | |
104 | | - | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
105 | 120 | | |
106 | | - | |
107 | | - | |
108 | | - | |
109 | | - | |
110 | | - | |
111 | | - | |
112 | | - | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
113 | 131 | | |
114 | 132 | | |
115 | 133 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
160 | 160 | | |
161 | 161 | | |
162 | 162 | | |
163 | | - | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
164 | 167 | | |
165 | 168 | | |
166 | 169 | | |
| |||
238 | 241 | | |
239 | 242 | | |
240 | 243 | | |
| 244 | + | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + | |
| 255 | + | |
| 256 | + | |
| 257 | + | |
| 258 | + | |
| 259 | + | |
241 | 260 | | |
242 | 261 | | |
243 | 262 | | |
| |||
0 commit comments