gpt4 book ai didi

c++ - 无论如何我可以阻止 throw 调用 malloc

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:46:25 25 4
gpt4 key购买 nike

背景

在我的 C++ 程序中,我有一个 SIGALRM 处理程序,我想在其中通过抛出将信号转换为异常(我知道这通常不是好的做法,但在我正在处理的系统中,它可能是唯一选择)。我的问题是,当我们执行 malloc 时,可以调用 SIGALRM 处理程序,而 throw 将调用执行另一个 malloc 的 __cxa_allocate_exception。这两个 malloc 调用可能会在 glibc 2.12 中陷入僵局。我尝试预先分配异常,但对 __cxa_allocate_exception 的调用仍然发生。我检查了 gcc 的源代码,似乎没有任何条件可以调用 __cxa_allocate_exception。

其他背景

我在 try block 之前安装信号处理程序,并在 catch 之后卸载它。我从信号处理程序中抛出,这样我认为它会在 try block 内(我们不考虑在 catch 逻辑中接收到信号的情况)并且可以被正确捕获。

我想我遇到了此处描述的 malloc 死锁:https://sourceware.org/bugzilla/show_bug.cgi?id=13699在这里 https://sourceware.org/ml/libc-alpha/2012-02/msg00272.html .

问题

我的问题是:我是否可以阻止 throw 调用 malloc? (另外,我明白我在做malloc的时候可以屏蔽掉SIGALRM信号,但是怕屏蔽的地方太多)。

提前致谢。非常感谢任何帮助/引用。

最佳答案

一般的问题是,如果你的信号处理程序在任何异步不安全的库函数(例如 malloc 或 printf)中被调用,跳出信号处理程序(通过 longjmp 或异常)可能会使 glibc 处于不一致的状态状态,下次您调用任何东西时它会崩溃或以其他方式出现异常。

因此,即使您能够避免在异常设置中调用 malloc,并抛出异常并捕获并处理它,您的程序在下次调用 malloc 时仍然会崩溃。

避免这种情况的唯一方法是确保在异步不安全的库函数中不能调用信号处理程序。您可以通过使用 sigblock 来阻止和取消阻止每次调用程序中任何地方的信号不安全函数时的信号:

oldmask = sigblock(SIGALRM);
...call to malloc or printf or whatever...
setsetmask(oldmask);

这是可能的,但不太实用。

关于c++ - 无论如何我可以阻止 throw 调用 malloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37425944/

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