模板和继承打破了严格的别名规则
Strict aliasing rules broken with templates and inheritance
以下代码在 gcc 中警告我违反了严格的别名规则:
struct Base {
int field = 2;
};
template <typename T>
struct Specialization: public Base {
void method() {
Specialization copy;
field = copy.field;
}
};
int main() {
Specialization<int> s;
s.method();
}
warning: dereferencing type-punned pointer will >break strict-aliasing rules [-Wstrict-aliasing]
field = copy.field;
当我删除模板时,似乎可以正常编译。
struct Base {
int field = 2;
};
struct Specialization: public Base {
void method() {
Specialization copy;
field = copy.field;
}
};
int main(){
Specialization s;
s.method();
}
我真的违反了严格的别名规则还是 GCC 产生了误报?
我在 GCC8
上使用 -Wstrict-aliasing=3 -O3
不,提供的代码中没有严格的别名规则违规。它看起来像是 gcc 中的错误。
您可以向 gcc 提交错误报告(我无法在那里找到与所提供的代码段相关的任何内容),但是,根据 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=41874 的寿命和时间判断,我不希望立即修复。
以下代码在 gcc 中警告我违反了严格的别名规则:
struct Base {
int field = 2;
};
template <typename T>
struct Specialization: public Base {
void method() {
Specialization copy;
field = copy.field;
}
};
int main() {
Specialization<int> s;
s.method();
}
warning: dereferencing type-punned pointer will >break strict-aliasing rules [-Wstrict-aliasing] field = copy.field;
当我删除模板时,似乎可以正常编译。
struct Base {
int field = 2;
};
struct Specialization: public Base {
void method() {
Specialization copy;
field = copy.field;
}
};
int main(){
Specialization s;
s.method();
}
我真的违反了严格的别名规则还是 GCC 产生了误报?
我在 GCC8
上使用-Wstrict-aliasing=3 -O3
不,提供的代码中没有严格的别名规则违规。它看起来像是 gcc 中的错误。
您可以向 gcc 提交错误报告(我无法在那里找到与所提供的代码段相关的任何内容),但是,根据 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=41874 的寿命和时间判断,我不希望立即修复。