gpt4 book ai didi

delphi - 使用 asm 代码创建访问冲突用于测试目的的优点?

转载 作者:行者123 更新时间:2023-12-01 22:20:14 26 4
gpt4 key购买 nike

我们最近开始使用 madExcept 而不是 ExcMagic 作为我们的异常处理程序。我们还在开发 64 位应用程序,因此希望尽可能消除使用 asm 代码。

ExcMagic 有这个过程来创建访问冲突以用于测试目的。

procedure CreateAccessViolation
begin
asm
mov eax,11111111h
mov ebx,22222222h
mov ecx,33333333h
mov edx,44444444h
inc dword ptr [eax]
end;
end;

使用该代码而不是仅仅编写有什么优势

raise EAccessViolation.Create('Just testing...');

ExcMagic 开发人员使用它肯定有某种原因。

谢谢!

最佳答案

在操作系统级别,异常不是对象。它们是可能携带附加上下文数据的数值。当您尝试读取或写入无效地址时,您会收到异常代码 Exception_Access_Violation,其中上下文给出了尝试的操作和地址,但是当您使用 raise 保留字时,您会得到带有 connect 的异常代码 cDelphiException 给出了 Delphi 对象引用。 (您知道吗,您可以抛出任何对象,而不仅仅是Exception的后代?)

用 Delphi 的说法,操作系统级异常被称为运行时错误

SysUtils 单元中的代码会将汇编代码创建的访问冲突运行时错误转换为 EAccessViolation Delphi 异常。这使得使用 Delphi 的 try- except 语法很容易捕获。

如果调用堆栈上有非 Delphi 代码(或者甚至可能是不使用 SysUtils 的 Delphi 代码),它可能无法识别 cDelphiException 异常代码,即使它可以识别,它可能无法区分一种 Delphi 对象类型与另一种。另一方面,Exception_Access_Violation 在所有 Windows 代码中都是已知的。

如果您想测试访问冲突的行为,最好是进行实际的访问冲突。这就是汇编代码试图做的事情。 (它是否成功是一个单独的问题。)如果您想测试 Delphi 对象的捕获,则抛出您想要的任何对象,包括 EAccessViolation 的实例。

关于delphi - 使用 asm 代码创建访问冲突用于测试目的的优点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38704950/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com