3
我真的很困惑。解引用类型指针会打破严格别名规则[-Wstrict-aliasing]
uint8_t hash[20];
uint32_t u;
// Setting hash to some value here...
u = *(uint32_t*) hash;
这*(uint32_t*) hash
将导致警告:
Dereferencing type-punned pointer will break strict-aliasing rules [-Wstrict-aliasing]
。
我认为这是错误的类型转换,但我不确定,因为我不清楚如何*(type*) var
类型转换的方式实际工作。它似乎指向内部带有星号的物体。我很困惑,这就是迫使我问一个关于这个问题的事情。 特别是我想知道type*
与*(type*)
的区别。这可能有很多帮助摆脱这个警告。 在此先感谢。
谢谢了许多的帮助!我不知道这是非法操作。 – Duosora 2014-11-03 12:09:34
严格的别名规则不是关于endiannes(尽管这可能是一个问题),但由于规范不允许别名类型,编译器会做出可能证明无效的假设,导致隐含的错误。您可以通过在编译时使用-fno-strict-aliasing标志来避免这种情况。 – doron 2014-11-03 12:54:58
@doron你不应该那样做。列出的其他问题仍然会导致未定义的行为。请不要低估正确的答案。 – 2501 2014-11-03 12:56:02