2010-09-28 6 views
4

J'ai le code suivant:Pourquoi aucun avertissement strict-aliasing n'est généré pour ce code?

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"); 
    } 
} 

Je compile le code avec la ligne de commande suivante:

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

J'utilise GCC 4.5.0. Je m'attendais à ce que le compilateur imprime l'avertissement:

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

Mais ça ne l'est jamais. Je peux obtenir l'avertissement pour d'autres cas, mais je me demande pourquoi, dans ce cas, ce n'est pas le cas. N'est-ce pas un exemple évident de violation des règles strictes d'alias?

+2

'... -W strict-aliasing = 1 ...' produit l'avertissement – pmg

Répondre

1

docs de GCC pour -Wstrict-aliasing=2 dit (Souligné par l'auteur):

Niveau 2: agressif, rapide, pas trop précis. Peut encore avoir beaucoup de faux positifs (pas autant que le niveau 1 si), et quelques faux négatifs (mais peut-être plus de niveau 1). Contrairement au niveau 1, il avertit uniquement lorsqu'une adresse est prise. Avertit des types incomplets . Fonctionne uniquement sur le frontal.

Il semble que votre code est pas trop difficile, donc je ne sais pas pourquoi il y aurait un faux négatif, mais peut-être parce que vous n'utilisez pas la & adresse de l'opérateur pour effectuer la aliasing (qui pourrait être ce qui signifie « met en garde contre seulement lorsqu'une adresse est prise »)


Mise à jour:

Il est de ne pas en utilisant l'adresse de l'opérateur. Si j'ajoute le code suivant au fichier foo.c:

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

    foo(&myB); 

    return 0; 
} 

L'avertissement est émis.

Si usefoo() se trouve dans une unité de compilation séparée, aucun avertissement n'est émis.

+0

Ah oui, cela a du sens maintenant. Je pensais incorrectement -Wstrict-aliasing = 2 était le niveau d'avertissement le plus élevé. Merci! – Andrew

Questions connexes