Windows:APE退出状态由8左移(出站代码不回转;失败读作POSIX shells中的成功)

作者: farkasmark创建于 2026年9月9日更新于 2026年9月10日

□ 总结

在Windows上,一个以cosmocc' 退出而建立的程序,其状态** 由8**所左所左所左所左所左所左所左所左所左所左所左所左所左所左所左所左所左所左所左所左所左所左所左所左所左所左所左所左所左所左所左所左所左所左所右所左所左所左所左所左所左所左所左所左所左所左所左所左所左所左所左所左所左所左所左所左所左所左所左所左所左所左所左所左所左所左所左所左所左所出所出所出所出所出所出所出所出所出所出所出所出所出所出所出所出所出所出所出所出所出所出所出所出所出所出所出所出所出所出所出所出所出所出所出所出所出所出所出所出所出所出所出所出所 返回1'成为256'的视窗程序退出码,返回42'成为`10752'。

其实际后果是,在Windows(MSYS2,Cygwin,Git Bash)上的POSIX型外壳中,每一次失败看起来都像是成功,因为这些外壳只保留了低字节和"编码QQ 8",对任何代码 < 256的字节都低为"0". " cmd.exe " 和 " PowerShell " 的数值变化。 无论哪种方式,退出状态都不往返.

在CI中,我为运送一个APE:一个正确称为`exit(1)'的建造工具,打印出错误,没有写出输出文件,外壳仍然看到成功。 任何 " 工具 " 形式在失败后无声地进行。

□再现.

页:1

  • 退出代码.c */

#包括"stdlib.h" 内主( in argc, char **argv) { 返回参数 > 1? atoi(argv[1]): 1; {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢?


嘘
cosmocc - O0 - o出站码.com出站码.c

运行它,请求一个特定的退出代码,并比较外壳报告的内容:

嘘 {\fn方正粗倩简体\fs12\an8\1cHFFFF00\b0}音乐 c 在 0 1 2 3 42 127 255; do./exitcode.com $c;回声"$c - > $";完成;


动力壳
# 动力壳 #
(c in 0, 1, 2, 42, 255) { &.\exicode.exe $c; "$c - > $LASTEXITCODE" }

战斗

  • CMd.exe(延迟扩展,否则% ERRORLEVEL% 在解析时扩展) cmd /v:on /c"出道码.exe 42和回声!ERRORLEVEL!"

□被观察

[永久失效連結] MSYS2 Bash '$?' PowerShell '$LASTEXITCODE ' ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------
|:|也.
                                                                                                                                                                                                       
                                                                                                                  
====================================================================================================================================================================================
                                                                          
=================================================================================================================================================================================================
255起** 起** 起** 65280起** 起** 65280起** 65280起**

所观察到的值与所测试的每个值的`编码 ' 8 ' 完全相同。

□ 预期

出口代码应作回转:`返回42'应被看成`42'。

^ Control – 用本地 Windows 编译器构建的同源

同样的'.c',用MSYS2'的UCRT64 GCC所制造的同一种外壳,因此将行为隔离给APE而不是外壳:

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|:|也.
                                                           
. . . . . . .

内容来源: jart/cosmopolitan