什么是__builtin_expect()原型?

时间:2017-02-16 18:13:15

标签: c powerpc misra

要摆脱静态代码分析警告(QA-C),我需要为__builtin_expect()提供函数原型。

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

  

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

所以,我的原型如下:

long __builtin_expect(long exp, long c);

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

  

错误(dcc:1701):原型上的无效类型为内在__builtin_expect - 启用内在函数时,可选用户原型必须匹配

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

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

2 个答案:

答案 0 :(得分:4)

您应该仔细阅读GCC中Other Builtins的文档。

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

#define _builtin_expect_replacement(Exp,C) (Exp)

对于大多数应该足够的静态分析仪

不要期望大多数GCC内置版本可以作为函数来定义。

答案 1 :(得分:4)

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

这样的事情会起作用:

#ifdef _HEY_I_AM_RUNNING_STATIC_ANALYZER
#define __builtin_expect(e,c) (e)
#endif

我不知道静态分析仪的工作原理,所以我不知道在#ifdef中要测试的宏是什么。您可以阅读静态分析器的文档,以确定它是否默认定义了任何预处理器符号,或者您可以告诉它在运行时要定义哪些预处理器符号。