繁体   English   中英

在C ++中写入随机内存块时如何捕获异常

[英]How to catch exception when write to a random memory block in c++

int main()
{
    int *a; // a = 0x4053c6 (a random address)
    // this will cause the program to exit, and how do i know this memory can't be written ?
    *a = 5;
    return 0;
}

困惑! 我的意思是,此代码段总是导致程序崩溃吗? 并且该程序是否可以从头到尾执行?

该代码将出现Segfault /具有访问冲突,根据操作系统的不同,该访问冲突将作为陷阱或信号处理。 您也许可以处理它,但是事后再执行其他操作的可能性很小。 (处理该问题后的通常做法是正常退出)。

至于确定存在这种情况,将很难证明这一点。 您可以拥有自己的编译器,该编译器将未初始化的变量设置为堆栈上的特定地址,例如(sarcasm)。

伪初始化a中的值的一种方法是调用一个函数:

void func(int k)
{
    int *a;
    int b = 0;
    if (k == 1) {
        a = &b;
    }
    *a = 5;
}

您可以尝试使用func(1)几次,然后再尝试func(2)。 a和b有可能会重用相同的堆栈区域并且不会失败。 但这又是一次机会

通常会导致崩溃,但是不能保证(由于变量未初始化,因此可以包含任何值,有效或无效)。 您无法使用C ++异常捕获访问冲突,但编译器会提供扩展来实现此目的。 例如,对于Visual C ++,可以使用SEH(结构化异常处理):

#include <Windows.h>
#include <iostream>

using namespace std;

int main()
{
    int* p = reinterpret_cast<int*>(0x00000100);

    __try
    {
        *p = 10;
    }
    __except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH)
    {
        cout << "Access violation" << endl;
        return -1;
    }

    cout << *p << endl;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM