GCC: exactitud de las advertencias estrictas de aliasing

Estoy tratando de verificar parte de mi código para ver si hay violaciones estrictas de aliasing, pero parece que me he perdido algo al tratar de entender la regla de aliasing estricta.

Imagina el siguiente código:

#include <stdio.h>

int main( void )
{
    unsigned long l;

    l = 0;

    *( ( unsigned short * )&l ) = 1;

    printf( "%lu\n", l );

    return 0;
}

Ejemplo clásico y básico. Con GCC 4.9 (-Wall -fstrict-aliasing -Wstrict-aliasing -O3), en realidad informa el error:

 dereferencing type-punned pointer will break strict-aliasing rules

Pero lo siguiente compila bien:

#include <stdio.h>

int main( void )
{
    unsigned long    l;
    unsigned short * sp;

    l       = 0;
    sp      = ( unsigned short * )&l;
    *( sp ) = 1;

    printf( "%lu\n", l );

    return 0;
}

En mi entendimiento, el segundo ejemplo también viola la regla de aliasing de estructura.
Entonces, ¿por qué se compila? ¿Es un problema de precisión en GCC, o me he perdido algo con un alias estricto?

También encontré el siguiente tema:¿Por qué no se generan advertencias de alias estricto para este código?

Compilando con-Wstrict-aliasing=2 o-Wstrict-aliasing=3 No hace diferencia.
Pero-Wstrict-aliasing=1 informa el error en el segundo ejemplo.

La documentación de GCC dice que el nivel 1 es el menos preciso y puede producir muchos falsos positivos, mientras que el nivel 3 es el más preciso ...

Entonces, ¿qué está pasando aquí? ¿Un problema con mi propia comprensión o un problema con GCC?

Pregunta extra

Por lo general, prefiero Clang / LLVM sobre GCC para mis proyectos, pero parece que Clang no emite ninguna advertencia sobre el alias estricto.
¿Alguien sabe por qué?
¿Se debe a que no puede detectar infracciones o porque no sigue la regla al generar código?

Respuestas a la pregunta(4)

Su respuesta a la pregunta