C MISRA 2004规则8.3:澄清

C MISRA 2004规则8.3:澄清,c,misra,C,Misra,在我的代码中使用它之前,我只想澄清以下内容是否违反了MISRA。我正在从文件中调用一个函数,如下所示: (void)Dem_SetEventStatus((Dem_EventIdType)(dtcFlt_t.dtc[dtcIndex]),DEM_EVENT_STATUS_FAILED); extern FUNC(Std_ReturnType, RTE_CODE) Dem_SetEventStatus (Dem_ASR42_EventIdType EventId, Dem_ASR42_Even

在我的代码中使用它之前,我只想澄清以下内容是否违反了MISRA。我正在从文件中调用一个函数,如下所示:

(void)Dem_SetEventStatus((Dem_EventIdType)(dtcFlt_t.dtc[dtcIndex]),DEM_EVENT_STATUS_FAILED);
 extern FUNC(Std_ReturnType, RTE_CODE) Dem_SetEventStatus (Dem_ASR42_EventIdType EventId, Dem_ASR42_EventStatusType EventStatus);
此处
Dem\u SetEventStatus
在一个标题中定义如下:

(void)Dem_SetEventStatus((Dem_EventIdType)(dtcFlt_t.dtc[dtcIndex]),DEM_EVENT_STATUS_FAILED);
 extern FUNC(Std_ReturnType, RTE_CODE) Dem_SetEventStatus (Dem_ASR42_EventIdType EventId, Dem_ASR42_EventStatusType EventStatus);
这里的
Dem\u EventIdType
unit8
的typedef,而
Dem\u ASR42\u EventIdType
无符号short


那么,是否会违反MISRA 8.3??如何防止它?

此规则与调用函数无关

MISRA-C:2004规则8.3是关于定义和声明函数,而不是调用它们。它要求声明和定义完全相同,声明必须采用原型格式(8.1),并指定所有参数类型和给定名称(16.3)

这里真正的问题是:如果您知道函数需要
Dem\u ASR42\u EventIdType
,那么为什么要强制转换为其他类型?这没有道理。如果强制转换以屏蔽最低字节,则应分几个步骤编写代码:

Dem_EventIdType event_id = (Dem_EventIdType)dtcFlt_t.dtc[dtcIndex];
(void)Dem_SetEventStatus((Dem_ASR42_EventIdType)event_id, DEM_EVENT_STATUS_FAILED);

这不是MISRA所要求的,而是常识。

此规则与调用函数无关

MISRA-C:2004规则8.3是关于定义和声明函数,而不是调用它们。它要求声明和定义完全相同,声明必须采用原型格式(8.1),并指定所有参数类型和给定名称(16.3)

这里真正的问题是:如果您知道函数需要
Dem\u ASR42\u EventIdType
,那么为什么要强制转换为其他类型?这没有道理。如果强制转换以屏蔽最低字节,则应分几个步骤编写代码:

Dem_EventIdType event_id = (Dem_EventIdType)dtcFlt_t.dtc[dtcIndex];
(void)Dem_SetEventStatus((Dem_ASR42_EventIdType)event_id, DEM_EVENT_STATUS_FAILED);

这不是MISRA的要求,而是常识。

正如Lundin建议的那样,MISRA-C:2004规则8.3要求声明和定义相同。。。因此,该示例并不违反规则8.3

但是,函数调用(如图所示)违反了MISRA-C:2004规则10.1,因为它包含隐式类型转换

注:该问题也正在(官方)讨论中


虽然强制转换应该解决这个问题,但最好理解变量的基本类型,并(如果合适)更改定义以协调它们。

正如Lundin建议的那样,MISRA-C:2004规则8.3要求声明和定义相同。。。因此,该示例并不违反规则8.3

但是,函数调用(如图所示)违反了MISRA-C:2004规则10.1,因为它包含隐式类型转换

注:该问题也正在(官方)讨论中


虽然强制转换应该可以解决这个问题,但最好了解变量的基本类型,并(如果合适)更改定义以协调它们。

我按照您建议的方式编辑了代码,但MISRA 8.3仍然有一个错误,即符号“Dem_SetEventStatus”被重新声明。我关心的是解决MISRA冲突,因为以前的版本也工作正常。@AnkitShah听起来像是您的工具认为函数调用是函数声明。要么是工具错误,要么是你忘了包含相关的标题。我按照你建议的方式编辑了代码,但我还是收到了MISRA 8.3的一个错误,即符号“Dem_SetEventStatus”被重新声明。我关心的是解决MISRA冲突,因为以前的版本也工作正常。@AnkitShah听起来像是您的工具认为函数调用是函数声明。工具错误和/或您忘记包含相关标题。