关于代码异常的问题
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文件,执行会抛出异常。这正是我想要的。以上是关于关于代码异常的问题的主要内容,如果未能解决你的问题,请参考以下文章
java问题 ~~求教高手 13) 以下关于异常的说法,错误的是