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

时间:2011-03-28 12:00:56

标签: c misra

我将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而不进行投射?

4 个答案:

答案 0 :(得分:3)

标准'NULL'有什么问题?

答案 1 :(得分:2)

如果可以避免,为什么选择投票? Cast总是让代码变得更脏一点,并暗示有一些hacky被执行。

所以我只是在没有强制转换的情况下传递NULL_PTR。 检查函数规范后,它可以接受NULL_PTR作为其第二个参数!!!

答案 2 :(得分:1)

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

无论使用NULL还是NULL_PTR,我都认为普遍的共识是在不进行转换的情况下传递NULL。我的功能在接受它时没有任何问题。这样,我可以避免压制Misra 11.3规则。

希望我正在以正确的方式前进。

答案 3 :(得分:1)

  

在编译时,Misra引发了规则11.3违规错误。

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

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

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