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

What can be the alternate way to solve MISRA 2012 Rule 17.3 violation?

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 规则。这种违规行为是否有效,或者这是我正在使用的静态分析工具中的错误。此外,是否有任何替代解决方案可以在不更改代码工作流程的情况下避免这种违规行为?

然而,当我将代码修改为这个时-

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 的违规报告。我在这里无法理解函数指针的工作原理。这是解决这个问题的正确或合乎道德的方法吗?还是静态分析工具本身有问题?

规则 17.3 是 "a function shall not be declared implicitly",指的是旧的 C90 方法,即使在没有原型格式声明的情况下也允许调用函数。

您的代码没有这样做。它所做的只是通过函数指针调用函数。所以不存在 MISRA 违规,这是误报和静态分析器中的工具错误。

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