加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 修改“__cxa_allocate_exception”,表示没有使用malloc

发布时间:2020-12-16 10:05:52 所属栏目:百科 来源:网络整理
导读:我在一个安全的嵌入式系统中工作,我想稍微修改一下异常处理. __cxa_allocate_exception正在使用malloc()为异常对象分配内存. malloc / new在安全应用程序中是不允许的,所以我必须重写它. 现在我的问题是:在这种情况下有没有办法避免malloc? 一些替代方案是
我在一个安全的嵌入式系统中工作,我想稍微修改一下异常处理. __cxa_allocate_exception正在使用malloc()为异常对象分配内存. malloc / new在安全应用程序中是不允许的,所以我必须重写它.

现在我的问题是:在这种情况下有没有办法避免malloc?

一些替代方案是:

>使用静态缓冲区,这将导致多任务/多核应用程序出现问题,所以我不能这样做.
>在堆上写入也会导致一些麻烦,因为堆可能已满(内存不足会无效).
>最后,也许我可以分配(例如)16kb的任务堆栈空间,并且每个异常对象将具有1kb的常量大小.这样,我可以处理多达16个例外.如果它有任何意义或者甚至是可能的话,我对堆栈的理解可悲地低,对它进行评级.

解决方法

看看: gcc-6.3.0 / libstdc -v3 / libsupc /eh_alloc.cc(或更高版本).指定了池(内存)类,并在匿名命名空间中将其实例化为emergency_pool.您可以调整EMERGENCY宏值,或者完全替换实现 – 只要您考虑使用池中的线程安全性.

如果您事先了解调用堆栈深度,则可以修复池缓冲区的值,该值始终足够.同样,您可能需要同步原语以获得线程安全性.

如果这还不够,__cxa_allocate_exception会在分配失败时调用std :: terminate.这里是std::set_terminate可能为您提供最后一次抢救重要信息的机会.

对于线程安全性,请使用与池相同的__gnu_cxx :: __互斥对象,以及__gnu_cxx :: __ scoped_lock惯用法.这样你就不依赖于libsupc不依赖的任何东西,比如标准库atomics或std :: mutex,或者std :: lock_guard – 即创建对libstdc的依赖.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读