2

我将 a 定义NULL_PTR0U

然后以 thisNULL_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

4 回答 4

3

标准“NULL”有什么问题?

于 2011-03-28T12:22:00.810 回答
2

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

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

于 2011-03-28T12:11:58.500 回答
1

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

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

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

于 2011-03-29T02:59:10.503 回答
1

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

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

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

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

--

对于 MISRA C:2004,规则 11.3 是建议性的,提供建议……规则还说这种情况可能是不可避免的。因此,可以忽略违规(有正当理由)。如果应用 MISRA 合规性,则该规则可能不适用

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

于 2012-09-27T09:42:16.747 回答