__builtin_expect() 原型是什么?

ser*_*gej 2 c powerpc misra

为了摆脱静态代码分析警告 (QA-C),我需要为__builtin_expect().

我正在为 PowerPC使用WindRiver Diab编译器。在编译器手册中,我找到了以下信息:

__builtin_expect(long exp, long c): ...exp也是返回值。

所以,我的原型如下:

long __builtin_expect(long exp, long c);
Run Code Online (Sandbox Code Playgroud)

但是,它不编译,我收到以下错误:

错误 (dcc:1701):原型到内部 __builtin_expect 的无效类型 - 当内部被启用时,可选的用户原型必须匹配

看来我的原型不正确。什么是正确的原型__builtin_expect?

错误消息指出用户原型是可选的。所以应该可以定义它,对吧?

Bas*_*tch 5

您应该仔细阅读GCC中其他内置函数的文档。

作为第一个近似值,您可以替换__builtin_expect为(调用_builtin_expect_replacement)下面的宏:

#define _builtin_expect_replacement(Exp,C) (Exp)
Run Code Online (Sandbox Code Playgroud)

对于大多数静态分析器来说应该足够了

不要指望大多数 GCC 内置函数都可以定义为函数。


Dav*_*son 5

您需要以某种方式定义__builtin_expect以使您的静态分析器满意,因为它不知道该函数是什么。但是#ifdef当您正常编译程序时,您需要使用来禁用该定义,因为如果您尝试自己定义编译器内置函数,您的编译器将不喜欢它。内置函数随编译器一起提供,因此不应在您的程序中定义它们。

像这样的事情会起作用:

#ifdef _HEY_I_AM_RUNNING_STATIC_ANALYZER
#define __builtin_expect(e,c) (e)
#endif
Run Code Online (Sandbox Code Playgroud)

我不知道静态分析器如何工作的细节,所以我不知道在#ifdef. 您可以阅读静态分析器的文档以了解它是否默认定义了任何预处理器符号,或者您是否可以告诉它在运行时定义哪些预处理器符号。