关于代码异常的问题

Posted

技术标签:

【中文标题】关于代码异常的问题【英文标题】: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 对您的问题的回答中添加了您的更正/澄清。 【参考方案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文件,执行会抛出异常。这正是我想要的。

以上是关于关于代码异常的问题的主要内容,如果未能解决你的问题,请参考以下文章

关于Eclipse中Junit的异常问题

java问题 ~~求教高手 13) 以下关于异常的说法,错误的是

关于我在代码中遇到的异常,我需要解决方案

关于java中异常机制

Python CodeLab 关于异常的问题——尝试,除了 ValueError

关于异常处理