模仿GCC的__builtin_unreachable?

Joh*_*itb 23 c++ gcc unreachable-code

我得到了很多关于交换机的警告,这些交换机仅部分覆盖了切换的枚举范围.为此,我想有一个"默认"所有这些开关,并将__builtin_unreachable(GCC内置),在这种情况下,让编译器知道这种情况是不可达.

但是,我才知道GCC4.3还不支持内置版.有没有什么好方法可以模仿这个功能?我考虑过取消引用空指针,但这可能有其他不良影响/警告等.你有更好的主意吗?

fuz*_*fuz 9

您可以调用声明的内联函数,_Noreturn以便在该调用之后将任何内容标记为无法访问.允许编译器在这样的函数之后抛出任何代码.如果函数本身是static(并且确实返回),编译器通常也会内联函数.这是一个例子:

static _Noreturn void unreachable() {
    return; /* intentional */
}

/* ... */

foo();
bar(); /* should better not return */
unreachable();
baz(); /* compiler will know this is not reachable */
Run Code Online (Sandbox Code Playgroud)

请注意,如果标记的函数_Noreturn确实返回,则调用未定义的行为.确保永远不会调用所述函数.

  • 这是__builtin_unreachable的正确基础,它逐渐演变为内置的.因故意返回而禁用特定警告.除了返回之外可能还有一些其他的技巧,但这个as-is相当于__builtin_unreachable.将https://ideone.com/f8yrLX与https://ideone.com/VP6NOB进行比较 (2认同)

jan*_*neb 7

嗯,像(因为__builtin_unreachable()出现在4.5):


#define GCC_VERSION (__GNUC__ * 10000 \
                               + __GNUC_MINOR__ * 100 \
                               + __GNUC_PATCHLEVEL__)
#if GCC_VERSION >= 40500
#define my_unreachable()  __builtin_unreachable()
#else
#define my_unreachable() do { printf("Oh noes!!!111\n"); abort(); } while(0)
#endif

  • @litb:实际上,你问"我的编译器不允许我将代码指定为无法访问,如何告诉我的编译器代码无法访问".不真正计算.无论如何,至少在我的系统中,abort()标有__attribute __((__ numturn__)),因此编译器应该能够摆脱该调用下面的任何代码.我猜你仍然会收到警告. (4认同)
  • 但是这仍然假设代码是可达的.编译器不允许优化该printf并且中止,因此它必须发出该代码.我想特别告诉编译器宏放入的位置是不可达的,因此它省略了后面的所有控制流点的codegen或警告. (2认同)
  • @janneb不,我正在寻找一个解决方法来实现与`__builtin_unreachable`类似的东西.对"abort"的调用不会这样做,因为它已经定义了行为,所以编译器仍然必须在那个地方调用"abort":( (2认同)
  • @nos会伤害性能.这个地方已经证明是一个瓶颈,所以我需要避免编译器发出的任何无用的分支和样板,因为它认为某些代码是可达的(并且如果逻辑证明它无法到达,可能基于更高级别的逻辑,静态地纯粹分析代码是不可见的. (2认同)