什么是解决MISRA 2012规则17.3违规的替代方法?

时间:2018-05-04 06:36:30

标签: c typedef misra

MISRA 2012规则17.3规定永远不应隐含声明函数。但是,在这种情况下,在第6行,pf_func违反了MISRA 2012 17.3规则。

typedef unsigned long long uint64;
typedef void (*FOREACH_FUNC)(uint64 ull_key);
void main(FOREACH_FUNC pf_func)
{
    uint64 var;
    pf_func(var);   /*Violation reported on this line*/
}

此处,pf_func导致违反MISRA 17.3规则。此违规行为是否有效,或者这是我正在使用的静态分析工具中的错误。此外,是否有任何替代解决方案可以在不改变代码工作流程的情况下避免此违规行为?

但是,当我将代码修改为this-

typedef unsigned long long uint64;
typedef void (*FOREACH_FUNC)(uint64 ull_key);
FOREACH_FUNC pf_func(uint64 ull_key);
void main()
{
    uint64 var;
    pf_func(var);
}

第17.3号规则没有报告违规行为。我无法理解函数指针的工作原理。这是解决此问题的正确或道德方式吗?或者静态分析工具本身是否有任何错误?

1 个答案:

答案 0 :(得分:3)

规则17.3是“函数不应隐式声明”,并且指的是即使没有原型格式声明,也允许函数调用的旧C90方式。

您的代码不会这样做。它所做的就是通过函数指针调用函数。因此,没有MISRA违规,这是一个误报和静态分析器中的工具错误。

但是,假设您使用C99或更高版本,则最好使用stdint.h而不是自制的整数类型。