[英]MISRA C-2012 Rule 11.3 violation while trying to do a typecast from char to int pointer
[英]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.