¿Se pueden usar punteros restringidos para acceder al mismo objeto en algunos casos?

La mayoría de las definiciones de restringir dicen que es una promesa del programador al compilador que durante la vida útil del puntero, el puntero es la única forma de acceder al objeto. Esto permite que el compilador optimice la salida, porque sabe que solo se podrá acceder a ella mediante un puntero y, por lo tanto, solo podrá cambiarlo. Lo que si entiendo correctamente generalmente significa que el programa no tiene que recargar el valor al que apunta el puntero.

Si esto es correcto, entonces debería haber algunas excepciones cuando la palabra clave restringir debería ser utilizable, incluso si va en contra de la intención de cómo debe usarse.

Una cosa que viene a la mente sería cuando los datos a los que apunta el puntero nunca cambian realmente durante la vida útil del puntero. En tal caso, no es necesario volver a cargar los datos, incluso si los punteros apuntan a la misma ubicación, porque no cambian en la vida útil de los punteros. P.ej.:

int max(int *restrict a, int *restrict b) {
  return((*a > *b) ? *a : *b);
}

int main(void) {
  int num = 3;
  int max = max(&num, &num);
}

¿Es este un uso válido de restringir a pesar de que va en contra de cómo se debía usar? ¿El uso de la palabra clave de restricción como esta dará como resultado un comportamiento indefinido?

Respuestas a la pregunta(2)

Su respuesta a la pregunta