关于gcc 4.6.1错误的严格别名警告
Strict aliasling warning on gcc 4.6.1 bug
我试图用-pedantic-errors -pedantic -Wall -O2
在gcc上编译以下代码
#include <iostream>
void reset_uint32(uint32_t* pi)
{
char* c = (char*)(pi);
uint16_t* j = (uint16_t*)(c); // warning?
j[0] = 0;
j[1] = 0;
}
void foo()
{
uint32_t i = 1234;
reset_uint32(&i);
}
int main() {
foo();
}
但是我没有看到任何严格的混叠警告。我也试过启用
-fstrict-aliasing
-Wstrict-aliasing
但仍然没有警告。这是臭虫吗?
我重写了你的例子来产生一个关于违反严格混叠规则的警告:
void foo(int* pi) {
short* j = (short*)pi;
j[0] = j[1] = 0;
}
int main() {
int i = 1234;
foo(&i);
short* j = (short*)&i;
j[0] = j[1] = 0;
}
尽管如此,g++ 4.6只在使用-Wstrict-aliasing=2
而不是-Wstrict-aliasing
编译代码时显示警告。此外,它只显示main()
中强制转换的警告,而不是foo()
。但是我不明白为什么编译器会对这两种类型转换有不同的看法。
相关文章:
- 警告处理为错误这里有什么问题
- 部分定义/别名模板模板参数
- 如何在C++20中创建模板别名的推导指南
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- cppcheck在const std::string[]上引发警告
- GCC对可能有效的代码抛出init list生存期警告
- 如何在BST的这个简单递归实现中消除警告
- 关于std::move的使用,是否有编译警告
- g++ 在某个类成员未初始化时不发出警告
- 如何处理来自核心指南检查器的关于gsl::at的静态分析警告
- 告诉c++编译器该参数没有别名
- 使用typeid警告未使用的变量
- 示例C++项目编译中的警告
- boost::spirit::karma 替代生成器,带有 boost::variant 由字符串和字符串别名组成
- 继承模板类中的类型别名
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 如何修复编译器警告 C6386 和 C6385?
- Clang 对使用的类型别名发出"unused type alias"警告
- 违反严格别名并不总是会产生编译器警告
- 关于gcc 4.6.1错误的严格别名警告