gpt4 book ai didi

c++ - 调用 new(堆)后意外的汇编程序代码抛出异常

转载 作者:太空狗 更新时间:2023-10-29 21:51:03 26 4
gpt4 key购买 nike

我正在追踪一个异常,该异常是从编译器每次调用 new 后添加的代码的一部分抛出的。它是标准的 C++ new,它应该从堆中获取一些内存并调用类的构造函数。

我们在 SH4 处理器上运行带有 GCC 2.95(或不确定的 2.96)的 VxWorks 5.5.1。在 SNiFF+ 4.1 补丁 1 中编译。

C++ 代码如下所示。

CBlocksFile* pBlockFile = new CBlocksFile(szHeaderFile, szDataFile);

并且生成的汇编代码在调用 new 之后有一个terminate/delete/throw 处理。这种模式似乎适用于对 new 的所有调用。

// call to "new"
c4d6000 d14d mov.l @(0x134,pc),r1 (= 0x0c06c1e0 = ___builtin_new)
c4d6002 410b jsr @r1
c4d6004 e414 (mov #20,r4)
...
// compiler generates throw path address
c4d6022 d246 mov.l @(0x118,pc),r2 (= 0x0c4d6034)
...
// and pushes it to the stack
c4d602c 1121 mov.l r2,@(4,r1)
...
c4d6030 a002 bra +4 (==> 0x0c4d6038 : GOOD_PATH)
...
// throw path (there is no visible jump to this address)
c4d6034 a088 bra +272 (==> 0x0c4d6148 : THROW_PATH)
...
GOOD_PATH:
...
// call to constructor
c4d6058 d139 mov.l @(0xe4,pc),r1 (= 0x0c4d1730 T ___Q211CBlocksFilePCcT1bUcl)
...
c4d6060 410b jsr @r1
...
// normal path
return

THROW_PATH:
...
// same pattern again, compiler generates terminate path address
c4d6164 d22f mov.l @(0xbc,pc),r2 (= 0x0c4d6172)
...
// and pushes it to the stack
c4d616a 1121 mov.l r2,@(4,r1)
...
c4d616e a002 bra +4 (==> 0x0c4d6176 : NO_TERMINATE)
...
c4d6172 a039 bra +114 (==> 0x0c4d61e8 : TERMINATE_A)
...
NO_TERMINATE:
...
// delete handling
if ( ?? )
c4d617c 2118 tst r1,r1
c4d617e 8d04 bt/s +8 (==> 0x0c4d618a)
...
{
delete ??
...
c4d6184 d128 mov.l @(0xa0,pc),r1 (= 0x0c06be20 = ___builtin_delete)
c4d6186 410b jsr @r1
...
}
c4d618a 9044 mov.w @(0x88,pc),r0 (= 0x0000028c)
c4d618c 02ee mov.l @(r0,r14),r2
c4d618e 5121 mov.l @(4,r2),r1
c4d6190 6112 mov.l @r1,r1
c4d6192 1211 mov.l r1,@(4,r2)
c4d6194 d125 mov.l @(0x94,pc),r1 (= 0x0c06a880 = ___sjthrow)
c4d6196 410b jsr @r1

这个代码片段有什么用?它看起来不像无内存条件,因为 throw 不在新函数中。

为什么调用 throw?来自谁?这种将代码地址放入堆栈的模式有两次,稍后可能会用于执行。

谢谢

最佳答案

一个猜测是应用此模式,因为它是 c++ 的要求,如果构造函数抛出,则应释放对象的内存。因此,如果从构造函数中抛出异常,则新分配的对象将被删除。

您总是可以尝试从对象的构造函数中显式抛出一些东西,以查看执行采用哪条路径来验证此答案是否有用。

关于c++ - 调用 new(堆)后意外的汇编程序代码抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4507363/

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