Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

202
Vistas
Parámetros declarados restricciones y advertencias del compilador

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?

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

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); ^
over 4 years ago · Santiago Trujillo Denunciar

0

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".

over 4 years ago · Santiago Trujillo Denunciar

0

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.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda