我正在低于MISRA QAC警告。
此赋值是多余的。此对象的值在被修改之前从不使用。MISRA_2012,QAC,消息标识符:2982
我试图修改变量的本地状态为特定的错误值。
验证码:
FUNC(void, RTE_CODE) Rte_Server_S_service_exteriorLighting_UI_unsubscribeExteriorLightSettings (ExteriorLightingUI_unsubscribeExteriorLightSettings_subscriptionId_type subscriptionId, P2CONST(uint8, AUTOMATIC, RTE_APPL_DATA) consumerId, P2VAR(ExteriorLightingUI_AT_SubscriptionStatus, AUTOMATIC, RTE_APPL_DATA) status)
{
uint16 localStatus;
TS_MemSet(&localStatus, 0u, sizeof(localStatus));
uint8 conId;
uint8 isSubIdFound = COMH_FALSE;
if(subscriptionId == COMH_SUBSCRIPTION_TO_ALL)
{
conId = SubAll_ES_is_validate_ConsumerId(consumerId); //function call
if(conId < 2u)
{
localStatus = (uint16) COMH_SOMEIP_SUBSCRIPTION_CANCELLED;
isSubIdFound = COMH_TRUE;
}
else
{
localStatus = (uint16) COMH_SOMEIP_SUBSCRIPTION_ERROR;
}
}
else
{
localStatus = (uint16) COMH_SOMEIP_SUBSCRIPTION_ERROR;
}
if(isSubIdFound == COMH_FALSE)
{
localStatus = (uint16) COMH_SOMEIP_SUBSCRIPTION_TARGET_DELETED;
}
/* fill response buffer of SOMEIP method */
TS_MemCpy(status, &localStatus, sizeof(localStatus));
}
字符串
在此语句之前,我使用memset来填充localStatus中的0值。
在此语句之后,我使用memcpy来填充localStatus中的相关错误代码。
2条答案
按热度按时间y0u0uwnf1#
很有可能是
TS_MemCpy(status, &localStatus, sizeof(localStatus));
,应该是&status
。如果是这样,这应该不仅仅是MISRA违规,而是C编译器错误。也可能有其他原因:静态分析器可能无法解析这些不同的函数,因为你是逐个文件运行它的,而不是一次在整个项目中运行它。静态分析器在向函数传递未初始化的变量时往往会发出抱怨,但这在大多数情况下都是误报。
或者,如果静态分析器真的很聪明,它会告诉你这些函数调用只是废话,这可能是真的。我不知道这些函数做什么,但代码看起来很可疑。你可能有一些合理的理由调用它们(原子访问?符合MISRA标准库?),但通常对于普通的
uint16_t
,你应该简单地做:字符串
wdebmtf22#
我不确定代码中是否有什么错误,但是如果你用
COMH_SOMEIP_SUBSCRIPTION_TARGET_DELETED
替换COMH_SOMEIP_SUBSCRIPTION_ERROR
到localStatus
的赋值,你可以删除isSubIdFound
周围的所有内容。你可以这样做,因为最后一次对
localStatus
的赋值是多余的。所以我想说你的MISRA检查员是对的。