restringir-edness con pre-c99
-
12-09-2019 - |
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.
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ó.