【问题标题】:Dangerous pointer cast results in loss of const qualification危险的指针转换导致失去 const 资格
【发布时间】:2016-04-27 14:19:22
【问题描述】:

根据 ISO C 标准(6.3.16.1),一个指针只能分配给另一个指针,如果“两个操作数都是指向兼容类型的合格或非合格版本的指针,并且左边指向的类型具有所有右边指向的类型的限定符”。 我在静态分析工具中收到了该警告,但我不确定是否存在真正的问题。因为正如您在下面的代码中看到的那样,该指针将被传递给原型中具有“const”限定符的函数

int main()
{
    static volatile const signed int batu[5] = {1,2,3,4,5};
    unsigned int x = 5;
    func(x, (signed int *) batu);
}

signed int func(unsigned int p1, volatile const signed int *p2)
{
    return 0;
}

【问题讨论】:

  • 标准中没有6.3.16,少了.1。您用作参考的不是 ISO9899。
  • 如果 1) 它们不是绝对必需的或 2) 你不理解强制转换的所有 含义或 3) 你不完全接受它们,则不要使用强制转换。那么,为什么你使用那个演员表?
  • 这是部分6.5.16.1/1 (C99)
  • @atturri:C99 不是 C 标准!
  • @Olaf。我不介意它是否是 当前 标准。这是可以阅读问题中引用的标准。您不会在最新的 C 标准中找到该引用。

标签: c pointers casting constants


【解决方案1】:

您只需要删除您在调用该函数时的(signed int *) 演员表。变量 batu 和函数预期的参数 p2 属于同一类型(见下文),包括限定符,因此您根本不需要强制转换。

数组类型总是自动转换为其等效的指针类型,除非它是sizeof 或一元& 运算符的输入。来自 C 标准 6.3.2.1/3。

【讨论】:

  • Atturi 你说得很对,但是不建议使用 matlab 生成的代码并手动更改它。实际上,我正在尝试了解该错误是否真实
  • @batgun:这个错误确实很严重。恕我直言,一个会产生不必要和(可能)危险的演员表的工具应该尽快被丢弃。对于广泛使用的工具来说更是如此。
  • @batgun 在这种特殊情况下,如果您没有遗漏任何相关代码,则为误报。但是,如果代码使用了 volatile 已因其他目的而被删除的指针,则可能是有害的。
  • @olaf 你如何看待 func() 的原型。它的定义中有 volatile const。那么它会在该函数中重新获得 const 限定符吗?例如,当我尝试更改该函数范围内的值时,编译器对我很生气
  • @batgun 是的,如果您将指向非限定类型的指针作为函数参数传递,并且参数是指向限定类型​​的指针,那么只要您访问它通过那个参数变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-15
  • 2013-10-20
  • 1970-01-01
  • 2015-09-10
  • 1970-01-01
相关资源
最近更新 更多