gpt4 book ai didi

c - 为什么我的 x64 程序在 Windows 上无声地崩溃?

转载 作者:可可西里 更新时间:2023-11-01 14:08:52 29 4
gpt4 key购买 nike

考虑这个小程序:

int main(int argc, char *argv[])
{
*((int *) 0) = 1;
return 0;
}

显然,写入 $0 会导致内存访问错误。当使用 Visual C 将此程序编译为 32 位可执行文件并运行它时,Windows 7 清楚地显示程序已崩溃:(德语系统)

Screenshot

然而,当使用 Visual C 将程序编译为 64 位可执行文件时,它只是无声地崩溃。没有弹出系统对话框通知用户程序刚刚崩溃。

这是 x64 二进制文件的正常行为还是我的 Windows 7 配置有问题?我认为操作系统应该在程序崩溃时清楚地向用户显示,而不是默默地杀死它们......

编辑:对于所有声称编译器可能只是优化空指针访问的人来说,这里是程序集。可以看到非法内存访问就在那里,运行程序后在Windows的应用程序日志中也有显示。

; Listing generated by Microsoft (R) Optimizing Compiler Version 15.00.30729.01 

include listing.inc

INCLUDELIB LIBCMT
INCLUDELIB OLDNAMES

PUBLIC main
; Function compile flags: /Odtp
_TEXT SEGMENT
argc$ = 8
argv$ = 16
main PROC
; File d:\test.c
; Line 2
mov QWORD PTR [rsp+16], rdx
mov DWORD PTR [rsp+8], ecx
; Line 3
mov DWORD PTR ds:0, 1 ; here we go folks
; Line 4
xor eax, eax
; Line 5
ret 0
main ENDP
_TEXT ENDS
END

编辑 2:我还验证了 HKEY_CURRENT_USER\Software\Microsoft\Windows\Windows Error Reporting\DontShowUI 设置为 0。因此 Windows 被明确配置为报告崩溃。但它只对 x86 二进制文件有效,对 x64 二进制文件无效。是的,对于 x64 二进制文件,应用程序日志中报告了崩溃,但错误对话框(参见上面的屏幕截图)仅显示 x86 二进制文件而不显示 x64 二进制文件,尽管 DontShowUI 明确设置为 0。

EDIT 3:我在不同的 Windows 系统上进行了测试。以下是结果:

Windows 7: x86 shows crash dialog, x64 doesn't (as described above)
Windows 8: both x86 and x64 show the crash dialog
Windows 10: neither x86 nor x64 show the crash dialog

所以这里唯一表现不一致的系统实际上是 Windows 7。在所有其他系统上,崩溃对话框显示或不显示,而在 Windows 7 上,x86 和 x64 程序的崩溃之间存在不同的行为。很奇怪。

最佳答案

*((int *) 0) = 1; 的行为,以及您的整个程序,未定义

各种崩溃是这种未定义行为的表现。

某些编译器可能会将您的代码优化为 int main{}:gcc 已经在高优化设置上优化未定义的语句已有一段时间了。也许这就是 64 位编译行为的原因?

关于c - 为什么我的 x64 程序在 Windows 上无声地崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52718169/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com