gpt4 book ai didi

c++ - 我可以为 assert() 禁用 GCC 的 noreturn 属性吗

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:20:24 34 4
gpt4 key购买 nike

Glibc 在 assert.h 中使用 GCC 的 noreturn 属性:

extern void __assert_fail (...)
... __attribute__ ((__noreturn__));

这会导致 GCC 在进入调试器之前优化所有局部变量和 this 指针。优化甚至发生在 -Og 级别,并且在 -O0 级别省略了许多其他有用的优化,以至于测试变得非常缓慢。

理想情况下,我只想从那里删除 __noreturn__ 属性。我不在乎我的 assert() 是否运行得更快,我想看看它在何处以及为何触发。

是否有 GCC 命令行标志或任何其他机制可用于禁用 __noreturn__ 优化,而不禁用其他优化?


可运行示例代码:

#include <cassert>
int test(int x)
{
assert(x != 1);
return x + 10;
}
int main(int argc, char *argv[])
{
return test(argc);
}

这个例子在没有参数的情况下运行时断言。当使用 GCC 7.4 使用 g++ -Og -g -ggdb -otest test.cc 编译并在 gdb 中运行时,您可以看到回溯是无用的:

#4  0x0000555555554676 in test (x=<optimized out>) at test.cc:4
#5 0x000055555555467f in main (argc=<optimized out>, argv=<optimized out>) at test.cc:9

最佳答案

Jarod42 关于用自定义宏覆盖 assert 的评论给出了一个想法:

g++ -D__noreturn__=    ...usual options follow...

这只需将属性定义更改为空括号即可。它不是很漂亮,但至少可以用。

如果有一个关于在 noreturn 调用之前丢弃局部变量或类似的东西的特定优化标志,那就太好了,但我一直没能找到。所以这是我迄今为止最好的。

关于c++ - 我可以为 assert() 禁用 GCC 的 noreturn 属性吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57950820/

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