要摆脱静态代码分析警告(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
的正确原型是什么?
错误消息指出用户原型是可选的。所以应该可以定义它,对吧?
答案 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
中要测试的宏是什么。您可以阅读静态分析器的文档,以确定它是否默认定义了任何预处理器符号,或者您可以告诉它在运行时要定义哪些预处理器符号。