Trong mã được hiển thị bên dưới, tôi đã sử dụng tất cả các cách được tài liệu để phát hiện một ngoại lệ và đưa ra chẩn đoán. Nó sử dụng các từ khóa cố gắng/bắt C++, bắt một ngoại lệ SEH với các từ khóa mở rộng __try/__catch
, sử dụng các hàm winapi AddVectoredExceptionHandler() và SetUnhandledExceptionFilter() của Windows để cài đặt các bộ lọc VEH/SEH.Làm thế nào để báo cáo tràn bộ đệm ngăn xếp trên Windows?
Chạy ứng dụng này bằng Visual C++ 2003:
/GS: kết quả đầu ra "hello, world!" và chấm dứt bằng mã thoát 0.
/GS-: kết quả đầu ra "hello, world!" và kết thúc với mã thoát 0.
Chạy này với Visual C++ 2013:
/GS: không có đầu ra, chấm dứt với mã thoát -1073740791
/GS-: "hello, world" đầu ra và chấm dứt với lối ra với 0.
Làm cách nào để tạo chẩn đoán trong chương trình biên soạn VS2013 với/GS có hiệu lực?
#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;
}
Mã của bạn gây ra hành vi không xác định. Cách đáng tin cậy duy nhất để "phát hiện" là kiểm tra giới hạn trước khi thực hiện truy cập ngoài giới hạn –
... chẳng hạn như những gì sẽ được thực hiện nếu bạn đã sử dụng loại vùng chứa phát hiện. ví dụ. sử dụng 'std :: string' cho chuỗi và lập chỉ mục nó bằng hàm thành viên' at'. – Hurkyl
Vượt quá mức ngăn xếp khó phát hiện. Chúng chỉ kích hoạt khi bạn ghi đè lên khung ngăn xếp. Thử chuyển sang ngoại lệ thời gian chạy * Vượt quá giới hạn mảng *. Nó có thể hoạt động. – cup