Ni gcc 5 ni clang 3.6 dan advertencias cuando se violan las restrict del calificador restrict, incluso cuando se llama con -Wall . Considere el siguiente fragmento de código:
extern void f(char *restrict p, char *restrict q); void g(char *p) { f(p, p); } Ingenuamente, esperaba que la violación se pudiera determinar de forma estática, y esperaba que -Wall diera una advertencia. ¿Me he perdido una bandera en alguna parte, o hay algún problema con dar advertencias que no estoy viendo?
A partir de la versión 8, gcc ofrece una advertencia útil para el código anterior:
ac: In function 'g': ac:5:5: warning: passing argument 1 to restrict-qualified parameter aliases with argument 2 [-Wrestrict] f(p, p); ^La palabra clave restrict es una garantía explícita del programador de que los punteros en cuestión no tienen alias. En esencia, permite que el compilador omita el análisis de alias para esos punteros, porque el programador ya proporcionó la supuesta respuesta. Además de permitir una mejor optimización, esto también puede ahorrar tiempo de compilación. En programas grandes, el análisis puede ser bastante costoso, por lo que es potencialmente un gran problema por derecho propio.
Entonces, la respuesta a su pregunta es, creo, "los compiladores no están mirando, porque el código les dice que no se molesten".
Dado el código:
void test(int *restrict a, int *restrict b, int c) { a[0] += b[c]; } el único escenario afectado por el calificador restrict sería a==b+c ; en ese caso, el puntero en a se usaría para modificar un objeto al que también se accede a través de un puntero no relacionado en b . En todos los demás casos que se definirían en ausencia de restrict , ningún objeto al que se acceda a través a también se accedería a través de b , ni viceversa.
Un compilador que pudiera ver que una función que se pasó restrict : los argumentos de puntero calificados los usaron en violación de las reglas asociadas con ellos podría advertir útilmente sobre tal violación, pero un compilador que no puede ver una función no tendría forma de saber qué las combinaciones de argumentos serían válidas o no válidas.