c - 什么是 __builtin_expect() 原型(prototype)?

标签 c powerpc misra

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

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

__builtin_expect(long exp, long c): ... exp is also the return value.

所以,我的原型(prototype)如下:

long __builtin_expect(long exp, long c);

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

error (dcc:1701): invalid types on prototype to intrinsic __builtin_expect - when the intrinsic is enabled, optional user prototype must match

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

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

最佳答案

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

像这样的东西会起作用:

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

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

关于c - 什么是 __builtin_expect() 原型(prototype)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42281658/

相关文章:

c - 从单个项目和代码库编辑、调试和构建 c dll 和 exe

docker - 我可以在 IBM Power 系统上运行 docker 容器进行 x86 构建吗?

c - 通过 getauxval 检测 Power8 核心加密?

c - Linux 内核模块——冗余包含

C11 编译器一致性比较

assembly - PowerPC 上有屏蔽混合指令吗?

c++ - 由于无符号算术运算符的环绕而导致的 MISRA 错误

c - MISRA 违反规则 10.1 和枚举

c - 如何在 MISRAC :2012 that follows Dir 4. 12 和 4.8 中创建模块?

c - 为什么 Timer1 不在 PIC18 上计数?