Pergunta

Considerando este código, VC9 não detecta aliasing:

typedef struct { int x, y; } vec_t;

void rotate_cw(vec_t const *from,
               vec_t       *to)
{
        /* Notice x depends on y and vice versa */
        to->x = from->y;
        to->y = -from->x;
}

/* ... */
vec_t a, b;
rotate_cw(&a, &b); /* OK, no aliasing */
rotate_cw(&a, &a); /* FAIL, aliasing is not detected */

A correção óbvia é usar um temporário:

void rotate_cw(vec_t const *from,
               vec_t       *to)
{
        int temp = from->x;
        to->x = from->y;
        to->y = -temp;
}

É esse comportamento padrão? Eu estava esperando que o compilador, a menos que disse isso, assumiria ambos ponteiros para ser possivelmente alias.

Foi útil?

Solução

Confira esta resposta .

Tente colocar __restrict antes dos parâmetros , parece ser a única maneira ninguém encontrou de obter MSVC para dar qualquer aviso.

Outras dicas

O código como escrito é perfeitamente válido, em C89 ou C99. É obscuro, mas não há nada para o compilador para diagnosticar, de modo que não diagnosticar.

Se você usou C99 e 'restringir' em ambos os parâmetros da função, então você obtém um erro - se o seu compilador suporta C99. AFAIK, não há versão atual do MSVC ainda suportes C99 totalmente.

Antes de C99 inventou o qualificador restrict, alguns compiladores C incluiu otimização opções que encaminhá-los para fazer certas suposições sobre o uso do ponteiro; os manuais que eu vi para tais compiladores expressamente advertido que tais otimizações foram não compatível com os padrões, e pode arbitrariamente causa código usando certas construções particulares cujo comportamento foi definido pela Norma a se comportar de uma maneira que era ao contrário do standard e intenção do programador. Do ponto de vista do manual, as optimizações disse o compilador para compilar um subconjunto de C, que não define o comportamento de determinados casos de canto que foram definidos em C, mas que permita a geração de um código mais eficiente para os casos em que tenha definido.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top