gpt4 book ai didi

c - setjmp 和 GCC 的合法使用

转载 作者:太空宇宙 更新时间:2023-11-04 00:09:55 25 4
gpt4 key购买 nike

使用 GCC(对我来说是 4.0),这是合法的吗:

if(__builtin_expect(setjmp(buf) != 0, 1))
{
// handle error
}
else
{
// do action
}

我发现一个讨论说它在 2003 年给 GCC 带来了问题,但我想他们现在应该已经修复了它。 C 标准规定使用 setjmp 是非法的,除非它是四个条件之一,相关的条件是:

  • one operand of a relational or equality operator with the other operand an integer constant expression, with the resulting expression being the entire controlling expression of a selection or iteration statement;

但是如果这是一个 GCC 扩展,我能保证它能在 GCC 下工作吗,因为它已经是非标准功能了?我测试了它,它似乎可以工作,但我不知道我需要做多少测试才能真正破坏它。 (我将对 __builtin_expect 的调用隐藏在一个宏后面,它被定义为非 GCC 的空操作,因此对于其他编译器来说这将是完全合法的。)

最佳答案

我认为该标准所谈论的是解释做这样的事情:

int x = printf("howdy");
if (setjmp(buf) != x ) {
function_that_might_call_longjmp_with_x(buf, x);
} else {
do_something_about_them_errors();
}

在这种情况下,您不能再依赖于 x 具有在上一行中分配的值。编译器可能已经移动了 x 所在的位置(重新使用它所在的寄存器等),因此进行比较的代码将查找错误的位置。 (你可以将 x 保存到另一个变量,然后在调用函数之前将 x 重新分配给其他东西,这可能会使问题更加明显)

在您的代码中,您可以将其编写为:

int conditional;
conditional = setjump(buf) != 0 ;
if(__builtin_expect( conditional, 1)) {
// handle error
} else {
// do action
}

而且我认为我们可以让自己满意的是,分配变量 conditional 的代码行满足该要求。

关于c - setjmp 和 GCC 的合法使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4621855/

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