【问题标题】:Casting a NULL pointer function argument resulted in violation of Misra Rule 11.3强制转换 NULL 指针函数参数导致违反 Misra 规则 11.3
【发布时间】:2011-03-28 12:00:55
【问题描述】:

我将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_PTR 应定义为(void *)0。请注意,这与 C++ 不同,您可以将其定义为 0
  • @Paul R. 为什么? 0u 在 C 和 C++ 中都是空指针常量。 (void*)0 是 C 中的空指针常量,但在 C++ 中不是。 NULL_PTR 是否打算具有指针类型或作为空指针常量是模棱两可的,所以我没有任何反对它是(void*)0,但大概以这种方式定义它会触发米斯拉规则,所以无论如何都不是一个选择。在 C++ 中,它几乎 必须 是整数类型才有用,因为没有从 void* 到其他指针类型的隐式转换,所以 (void*)0 不能在没有强制转换的情况下分配。跨度>
  • AFAIK,它具有整数类型而不是指针类型的主要问题是,当您在不强制转换的情况下愚蠢地在可变参数中使用它时会发生什么,因为人们错误地认为他们知道 NULL 具有什么类型,并且更有可能错误地认为它是一个指针,而不是错误地认为它特别是 int 而不是另一个整数类型。如果 Misra 禁止强制转换,那么你就完蛋了,你必须创建一个临时指针变量来包含该值。这同样适用于未原型化的函数调用,但 Misra 肯定也会禁止这些调用吗?
  • 如果 Misra 11.3 不允许 (void *)0 ,它是什么样的愚蠢规则?该表达式保证产生一个空指针常量
  • MISRA 不禁止强制转换 - 但 0u 不是指针,它是一个整数值。 @PaulR 是正确的!

标签: c misra


【解决方案1】:

标准“NULL”有什么问题?

【讨论】:

  • 它会触发 Misra 规则吗? C 实现允许(并且确实经常)将NULL 定义为(void*)0,这是指针和整数类型之间的转换...
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    希望我走的是正确的道路。

    【讨论】:

    • 我无法将 NULL_PTR 定义为 (void*)0U,因为它再次违反了 Misra 规则 11.3。我离开它 0U 并通过了 NULL_PTR 没有强制转换。
    【解决方案4】:

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

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

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

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

    --

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

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

    【讨论】:

      猜你喜欢
      • 2012-01-10
      • 1970-01-01
      • 2018-03-05
      • 2016-09-02
      • 1970-01-01
      • 1970-01-01
      • 2013-12-24
      • 2014-03-13
      • 1970-01-01
      相关资源
      最近更新 更多