【问题标题】:A question about the code exception关于代码异常的问题
【发布时间】:2011-09-23 01:55:05
【问题描述】:

环境:VS 2008,C++

我有如下代码:

void HopeException(LPVOID nVerify) 
{   
     char *p = NULL; 
     p = (char *)nVerify;  
     delete []p; 
}

当我使用参数 not-NULL 调用函数“HopeException”时,例如:

    HopeException(123);

那我希望程序会抛出异常。

但是当我在 VS 2008 上用 Release 模式编译代码时,程序运行良好。

我不知道为什么。谁能帮我解决这个问题?

或者你有什么好主意用另一种方法来实现这个功能?

编辑:

非常抱歉,我想我之前发布了错误的代码。

实际上,我正在为我的软件做保护。 我的软件会获取 DLL 文件的 CRC 值,然后我的软件会检查 CRC 值,如下所示:

    unsigned int VerifyCRC = FF234322;
    unsinged int CRC = getCRC("Fun.dll");
    LPVOID lpResult = CRC & (~VerifyCRC);
    HopeException(lpResult);

所以根据下面的代码,如果破解者破解Fun.dll文件,执行会抛出异常。
这正是我想要的。

【问题讨论】:

  • 该代码甚至不应该编译!
  • 删除非new分配的数据是未定义的,所以无论发生什么都取决于实现。看起来你只是在没有它在你脸上爆炸的情况下幸存下来。但是,您到底想做什么?
  • 我不知道你想用该代码做什么或实现什么,但我知道的是你表现出未定义的行为。
  • @Marlon 其实不一定。将指针存储在原语中应该是有效的 c++(尽管为此使用 int 并不是特别聪明,并且可能适得其反,但是哦,好吧)
  • @jell 我从 Ansons 对您的问题的回答中添加了您的更正/澄清。

标签: c++ visual-studio-2008 exception release


【解决方案1】:

Jell - C++ 为你提供了足够的绳索来吊死自己(很可能是大多数朋友)。

但是为什么要这样做呢? (- 假设这取决于你的朋友)。

【讨论】:

    【解决方案2】:

    您将nVerify 视为一个地址并将其分配给您的指针p,然后在该地址上调用delete[]。如果 nVerify 的值不是一个有效的地址,你可能会得到未定义的行为,其中包括程序看起来“运行良好”,主要是因为你在这个函数中没有真正做太多。

    你真正想做什么?

    【讨论】:

    • 非常抱歉,我想我发布了错误的代码,正确的代码如下: void HopeException(LPVOID nVerify) { char *p = NULL; p = (char *)n 验证;删除 []p; }
    【解决方案3】:

    该代码不应在 C++ 中编译;最接近应该编译好的东西是:

    void HopeException(int nVerify)
    {
          char *p = NULL;
          p = (char *)nVerify;
          delete []p;
    }
    

    这段代码会在 VS 2010 Express 上崩溃,所以我假设它也会在 VS 2008 中崩溃。如果您的目标是直接抛出调试器异常(在 x86 上),您可以使用

    __asm int 3;
    

    如果您的目标是闯入调试器,您也可以直接使用

    DebugBreak();
    

    【讨论】:

    • 实际上,我正在为我的软件做一个保护。我的软件会得到 DLL 文件的 CRC 值。然后我的软件将检查 CRC 值,如下所示: unsigned int VerifyCRC = FF234322; unsinged int CRC = getCRC("Fun.dll"); LPVOID lpResult = CRC & (~VerifyCRC); HopeException(lpResult);所以根据下面的代码,如果破解者破解Fun.dll文件,执行会抛出异常。这正是我想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    • 2020-07-17
    • 2011-09-25
    • 2011-05-31
    • 2011-01-22
    相关资源
    最近更新 更多