Строгое предупреждение псевдонимов при ошибке gcc 4.6.1 - PullRequest
6 голосов
/ 18 декабря 2011

Я пытаюсь скомпилировать следующее на gcc с -pedantic-errors -pedantic -Wall -O2

#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

но предупреждений пока нет. Это ошибка?

1 Ответ

1 голос
/ 18 декабря 2011

Я переписал ваш пример, чтобы вывести предупреждение о нарушении правил строгого алиасинга:

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

...