Pregunta

Teniendo en cuenta este código, VC9 no 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 */

La solución obvia es usar un temporal:

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

¿Es este comportamiento estándar? Yo estaba esperando que el compilador, a menos que así, asumiría ambos punteros a ser posiblemente alias.

¿Fue útil?

Solución

Salida esta respuesta.

Trate de poner __restrict antes de que los parámetros , parece ser la única manera de que nadie encontrado de conseguir MSVC para dar ninguna advertencia.

Otros consejos

El código escrito como es perfectamente válido, en C89 o C99. Es oscuro, pero no hay nada para el compilador de diagnosticar, por lo que no diagnostica.

Si ha utilizado C99 y 'restringir' en ambos parámetros de la función, a continuación, se obtendría un error - si su compilador soporta C99. Que yo sepa, no hay ninguna versión actual de MSVC todavía apoya plenamente C99.

Antes de C99 inventó el calificador restrict, algunos compiladores de C incluyen opciones de optimización que dirigirlos a hacer ciertas suposiciones sobre el uso del puntero; los manuales que he visto para este tipo de compiladores advirtió expresamente que tales optimizaciones fueron no compatible con los estándares, y pueden causar arbitrariamente código usando ciertas construcciones particulares cuyo comportamiento fue definido por el estándar que se comporten de una manera que era contraria tanto a la Norma y la intención del programador. Desde el punto de vista del manual, las optimizaciones dijeron que el compilador para compilar un subconjunto de C que no definen el comportamiento de ciertos casos de esquina que se definieron en C, pero que permitirían la generación de código más eficiente para esos casos definió.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top