使用GCC 5.4.0。
这个例子很简单。代码有两次违反了严格的别名规则。
“取消引用类型惩罚指针将破坏严格别名规则”
#include <stdint.h>
#include <inttypes.h>
int main() {
uint8_t buffer[100]; // line 1
uint32_t test = *((uint32_t*)(&buffer[10])); // line 2
uint32_t* pTest2 = (uint32_t*)(&buffer[10]); // line 3
test = *pTest2; // line 4
}
等级1:最具攻击性,快速,最不准确。当更高级别没有警告但-fstrict-aliasing仍然会破坏代码时可能很有用,因为它几乎没有错误的否定。但是,它有许多误报。 警告可能不兼容的类型之间的所有指针转换,即使从未解除引用。仅在前端运行。
现在我不确定-Wstrict-aliasing = 1实际上是多么可靠。这是GCC 5.4.0的问题吗?