- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在下面显示的代码中,我使用了所有记录的方法来检测异常并生成诊断。它使用 C++ try/catch 关键字,使用 __try/__catch
扩展关键字捕获 SEH 异常,使用 Windows 的 AddVectoredExceptionHandler() 和 SetUnhandledExceptionFilter() winapi 函数来安装 VEH/SEH 过滤器。
使用 Visual C++ 2003 运行:
/GS:输出“你好,世界!”并以退出代码 0 终止。
/GS-:输出“你好,世界!”并以退出代码 0 终止。
使用 Visual C++ 2013 运行:
/GS:无输出,以退出代码 -1073740791 终止
/GS-:输出“你好,世界!”并以 0 退出结束。
如何在/GS 有效的 VS2013 编译程序中生成诊断?
#include "stdafx.h"
#include <Windows.h>
#define CALL_FIRST 1
#define CALL_LAST 0
LONG WINAPI MyVectoredHandler(struct _EXCEPTION_POINTERS *ExceptionInfo)
{
UNREFERENCED_PARAMETER(ExceptionInfo);
printf("MyVectoredHandler\n");
return EXCEPTION_CONTINUE_SEARCH;
}
LONG WINAPI MyUnhandledExceptionFilter(_In_ struct _EXCEPTION_POINTERS *ExceptionInfo)
{
printf("SetUnhandledExceptionFilter\n");
return EXCEPTION_CONTINUE_SEARCH;
}
void f()
{
__try
{
char p[20] = "hello,world!";
p[24] = '!';
printf("%s\n", p);
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
printf("f() exception\n");
}
}
int _tmain(int argc, _TCHAR* argv[])
{
AddVectoredExceptionHandler(CALL_FIRST, MyVectoredHandler);
SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);
try{
f();
}
catch (...){
printf("catched f exception\n");
}
return 0;
}
最佳答案
处理堆栈缓冲区溢出检测的 CRT 函数 __report_gsfailure()
假定堆栈帧损坏是由恶意软件攻击引起的。此类恶意软件通常会与 fs:[0] SEH 异常过滤器(存储在堆栈帧中)混淆,以获得异常处理程序来触发恶意软件负载。将数据转化为可执行代码的方法之一。
因此 CRT 函数不能假设抛出异常是安全的。不再在 VS2013 附带的 CRT 中执行,返回到 ~VS2005。如果操作系统支持它,它将快速失败,如果不支持,则确保已注册的 VEH/SEH 异常处理程序也看不到异常。 Kaboom,除非您附加了调试器,否则会在没有诊断的情况下崩溃到桌面。
/SAFESEH 选项可以阻止这种恶意软件攻击,因此它不像以前那样严重。如果您的代码仍处于堆栈损坏错误的阶段,并且您的应用程序还不够流行,无法成为恶意软件的目标,那么您可以考虑更换 CRT 函数。
请务必与您的主管讨论此事,考虑到您的客户承担的巨大责任,您永远不想为此承担个人责任。历史很少讲述一位程序员的遭遇,他的代码让整个公司停业一个月。但肯定不是什么漂亮的东西。
将此代码粘贴到靠近 main() 函数的位置:
__declspec(noreturn) extern "C"
void __cdecl __report_gsfailure() {
RaiseException(STATUS_STACK_BUFFER_OVERRUN, EXCEPTION_NONCONTINUABLE, 0, nullptr);
}
并计划很快再次删除它。
关于c++ - 如何在 Windows 上报告堆栈缓冲区溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37428375/
我是一名优秀的程序员,十分优秀!