繁体   English   中英

强制转换 NULL 指针函数参数导致违反 Misra 规则 11.3

[英]Casting a NULL pointer function argument resulted in violation of Misra Rule 11.3

我将NULL_PTR定义为0U

然后使用此NULL_PTR作为参数调用函数。

read_some_data(2U, (uint8_t *const) NULL_PTR, (uint8_t *const) NULL_PTR);

调用函数原型:

int16_t read_some_data(const uint8_t id,   uint8_t *const data_1, uint8_t *const data_2);

在编译时,Misra 提出了违反规则 11.3 的错误。(不应在指针类型和整数类型之间执行强制转换。)

但是,如果我只是按如下方式传递NULL_PTR ,则没有违规。

read_some_data(2U, NULL_PTR, NULL_PTR);

哪种方法更好? 禁止 Misra 11.3 规则还是只通过NULL_PTR而不进行强制转换?

标准“NULL”有什么问题?

如果可以避免,为什么要强制转换? Cast 总是让代码更脏一点,并暗示有一些hacky 执行。

所以我只会通过 NULL_PTR 而不进行转换。 检查函数规范后,它可以接受 NULL_PTR 作为其第二个参数!!!

在编译时,Misra 提出了违反规则 11.3 的错误。

只是为了迂腐,MISRA 没有引发违规错误,您的编译器引发了 MISRA C:2004 规则违规错误。

从您发布的内容来看,我不相信所报告的违规行为是正确的...

另一方面,我个人将NULL_PTR定义为(void *)0u因为(严格来说) 0 不是指针。

——

对于MISRA C:2004年,规则11.3是咨询,提供建议......该规则还表示,这种情况可能是不可避免的。 因此,可以忽略违规(有理由)。 如果应用MISRA合规性,规则可disapplied。

或者,新版本中的等效指南 MISRA C:2012 规则 11.4 对空指针常量有明确的例外。

我在头文件中使用了 NULL_PTR 以避免使用 IAR 内部配置文件 yvals.h,它定义了 NULL。 但这不是问题,因为我以后可能由于其他原因不得不使用 yvals.h。

无论是使用 NULL 还是 NULL_PTR,我都假设普遍的共识是传递 NULL 而不进行强制转换。 我的函数在接受它时没有任何问题。 这样,我可以避免压制 Misra 11.3 规则。

希望我以正确的方式进行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM