Я переписал ваш пример, чтобы вывести предупреждение о нарушении правил строгого алиасинга:
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()
.Но я не могу понять, как / почему компилятор будет по-разному смотреть на эти два приведения.