C 危险的指针投射会导致常数资格的丧失

C 危险的指针投射会导致常数资格的丧失,c,pointers,casting,constants,C,Pointers,Casting,Constants,根据ISO C标准(6.3.16.1),如果“两个操作数都是指向兼容类型的合格或不合格版本的指针,并且左侧指向的类型具有右侧指向的类型的所有限定符,则只能将指针分配给另一个指针”。 我在静态分析工具中得到了警告,但我不确定是否存在真正的问题。因为正如您在下面的代码中所看到的,该指针将被传递给在其原型中具有“const”限定符的函数 int main() { static volatile const signed int batu[5] = {1,2,3,4,5}; unsign

根据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;
}

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


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

中,除a
.1
外,本标准中没有任何章节
6.3.16
。你所使用的任何引用都不是ISO9899。如果1)它们不是绝对必需的,或者2)你不理解该强制转换的所有含义,或者3)你不完全接受它们,就不要使用强制转换。那么,你为什么要使用这种类型?这是第6.5.16.1/1节(C99)@atturri:C99不是C标准@奥拉夫。我不介意它是否是当前的标准。这是可以阅读问题中引用的标准。你在最新的C标准中找不到这段引用。你说得很对,但不建议你使用由matlab生成并手动更改的代码。事实上,我正在努力理解这个错误是真的还是假的not@batgun:这个错误确实很严重。IMHO是一种产生不必要的和(潜在的)危险的铸件的工具,应该尽快扔掉。对于广泛使用的工具来说更是如此。@batgun在这个特殊的例子中,如果你没有遗漏任何相关的代码,那就是误报。但是,如果代码使用的指针的
volatile
已被删除用于其他目的,则它可能是有害的。@olaf您如何看待func()的原型。它的定义中有volatile const。那么它将在该函数中重新获得常量限定符?例如,当我试图更改该函数作用域中的值时,编译器会生气withme@batgun是的,如果您将指向非限定类型的指针作为函数参数传递,并且参数是指向限定类型的指针,那么只要您通过该参数变量访问,这些限定将在函数的持续时间内“获得”。