2010-09-28 10 views
4

У меня есть следующий код:Почему для этого кода не генерируются строгие сглаживания?

struct A 
{ 
    short b; 
}; 

struct B 
{ 
    double a; 
}; 


void foo (struct B* src) 
{ 
    struct B* b = src; 
    struct A* a = (struct A*)src; 

    b->a = sin(rand()); 

    if(a->b == rand()) 
    { 
     printf("Where are you strict aliasing warnings?\n"); 
    } 
} 

Я компиляции кода с помощью следующей командной строки:

gcc -c -std=c99 -Wstrict-aliasing=2 -Wall -fstrict-aliasing -O3 foo.c 

Я использую GCC 4.5.0. Я ожидал, что компилятор опубликует предупреждение:

warning: dereferencing type-punned pointer will break strict-aliasing rules 

Но это никогда не было. Я могу получить предупреждение для печати в других случаях, но мне интересно, почему, в этом случае, это не так. Не является ли это очевидным примером нарушения правил строгого сглаживания?

+2

'... -Wstrict-aliasing = 1 ...' вызывает предупреждение – pmg

ответ

1

документы GCC для -Wstrict-aliasing=2 говорит (курсив мой):

Уровень 2: Агрессивный, быстрый, не слишком точным. Возможно, все еще есть много ложных положительных (не столько, сколько уровень 1 ), а несколько ложных негативов (но возможно больше уровня 1). В отличие от уровня 1, он только предупреждает, когда принимается адрес . Предупреждает о неполных типах. Работает только в интерфейсе.

Похоже, что ваш код не слишком сложен, поэтому я не знаю, почему бы ложное отрицательное, но, возможно, это потому, что вы не используете & адрес оператора для выполнения сглаживание (это может быть то, что подразумевается под «только предупреждает, когда адрес берется»)


Update:

Он из не используя адрес-оператора. Если я добавлю следующий код в файл foo.c:

int usefoo(void) 
{ 
    struct B myB = {0}; 

    foo(&myB); 

    return 0; 
} 

Предупреждение выдается.

Если usefoo() находится в отдельной компиляционной единице, предупреждения не выдаются.

+0

Ах да, это имеет смысл сейчас. Я неправильно думал: «Высокий уровень сглаживания = 2» был самым высоким уровнем предупреждения. Благодаря! – Andrew