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

发布于 2024-10-27 10:29:33 字数 549 浏览 1 评论 0原文

我将 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 而不进行转换?

I define a NULL_PTR as 0U

Then call a function with this NULL_PTR as argument.

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

Called function prototype:

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

On compilation, Misra raised a rule 11.3 violation error.(A cast should not be performed between a pointer type and an integral type.)

But if I just pass the NULL_PTR as follows, no violation.

read_some_data(2U, NULL_PTR, NULL_PTR);

Which is the better way to do? Suppress Misra 11.3 rule or just pass the NULL_PTR without casting?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

你对谁都笑 2024-11-03 10:29:33

如果可以避免的话为什么还要施放呢?强制转换总是会让代码变得更脏,并暗示执行了一些黑客行为。

所以我只传递 NULL_PTR 而不进行强制转换。 检查函数规范后它可以接受 NULL_PTR 作为其第二个参数!!!

Why cast if you can avoid it? Cast always makes code a little bit more dirty and hints that there is something hacky performed.

So I would just pass NULL_PTR without casting. After checking function specification that it can accept NULL_PTR as its second parameter!!!

对岸观火 2024-11-03 10:29:33

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

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

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

I used NULL_PTR in my header file to avoid using IAR internal configuration file yvals.h which defines NULL. But that's not an issue since I may have to use yvals.h later due to other reasons.

Whether using NULL or NULL_PTR, I assume that the general consensus is to pass NULL without casting. My function doesn't have any problem in accepting it. This way, I can avoid suppressing Misra 11.3 rule.

Hope I am proceeding the right way.

两人的回忆 2024-11-03 10:29:33

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

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

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

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

--

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

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

On compilation, Misra raised a rule 11.3 violation error.

Just to be pedantic, MISRA did not raise a violation error, your compiler raised a MISRA C:2004 rule violation error.

From what you've posted, I'm not convinced the reported violation is correct...

On the other hand, personally I'd define NULL_PTR as (void *)0u because (strictly speaking) 0 is not a pointer.

--

For MISRA C:2004, Rule 11.3 is Advisory, providing a recommendation... the Rule also says that this situation may be unavoidable. As such, the violation may be ignored (with justification). If applying MISRA Compliance, the Rule may be disapplied.

Alternatively, the equivalent guideline in the newer version, MISRA C:2012 Rule 11.4 has an explicit exception for a null pointer constant.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文