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

249
Vistas
¿Por qué char de una matriz da una advertencia de subíndice en gcc para isspace en newlib?

Tengo problemas para entender una advertencia del compilador que tenemos en nuestro código. El código que tenemos es similar al de este ejemplo que da la advertencia (-Wchar-subscripts). Estamos utilizando ARM gcc 9.2.1 integrado y newlib como biblioteca estándar.

 #include <ctype.h> int main () { char str[]="Example string\n"; int i = isspace(str[1]); // Warning char c=str[1]; i = isspace(c); // No warning i = isspace((unsigned char)str[1]); // No warning }

Ejemplo en Godbolt

Por lo que he entendido, la implementación de isspace puede ser a través de la indexación de matrices. De ahí la advertencia. Pero en ese caso, ¿no deberían dar la advertencia tanto 1 como 2? ¿Por qué es sólo el primero el que da la advertencia?

Resolvimos nuestro código agregando un molde, pero no estoy realmente satisfecho hasta que entiendo por qué ayuda.

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

0

Este parece ser el mismo error que se discutió en Bugzilla aquí Error 95177 - error: el subíndice de matriz tiene tipo char . Básicamente, gcc es inconsistente en sus diagnósticos y este comportamiento solo apareció en versiones posteriores.

Como se discutió en ese hilo, pasar char a las funciones ctype.h podría, en teoría, ser un problema en caso de que char contuviera algo desconocido. Estas funciones se definen como la expectativa de que la entrada sea algo representable como unsigned char , consulte C17 7.4:

En todos los casos, el argumento es un int, cuyo valor se podrá representar como un carácter sin signo o será igual al valor de la macro EOF

Por lo tanto int i = isspace((unsigned char)str[1]); hace que la advertencia desaparezca.

Pero la advertencia es, como puede ver, inconsistente. Lo que posiblemente podría explicarse cuando usa ctype.h, el compilador a veces puede elegir una macro y, a veces, una función.

Simplemente desactívelo y considérelo como un falso positivo. De acuerdo con el registro de Bugzilla anterior, esto debería haberse solucionado recientemente. gcc (trunk) y gcc >10.3 ya no dan esta advertencia.

over 4 years ago · Santiago Trujillo Denunciar

0

La diferencia en los mensajes de advertencia entre isspace(str[1]) e isspace(c) se debe a un error en la función de GCC para suprimir los mensajes de advertencia en los encabezados del sistema.

Considere este código:

 #include <ctype.h> int foo(char c) { return isspace(c); } int bar(char c) { return ((((_ctype_)+sizeof(""[ c ]))[(int)( c )])&010); }

El código en bar es el resultado de aplicar el reemplazo de macros al código en foo (se obtuvo al compilar con -E para mostrar el resultado del preprocesamiento). Entonces, estas dos funciones tienen un código idéntico después del reemplazo de la macro y deberían tener una semántica idéntica. Sin embargo, el segundo código recibe una advertencia y el primer código no . Por lo tanto, los informes de GCC no se basan únicamente en la semántica C del código.

GCC tiene una función para suprimir las advertencias en los archivos de encabezado del sistema. Cuando esta función está deshabilitada (mediante -Wsystem-headers ), ambas funciones reciben un mensaje de advertencia. Por lo tanto, la advertencia que se produce con isspace(str[1]) pero no con isspace(c) se debe a un error de la función para suprimir los mensajes de advertencia en los encabezados del sistema. Es decir, es un error en GCC.

Para confirmar, usar -Wsystem-headers con el código original en la pregunta genera mensajes de advertencia tanto para isspace(str[1]) como para isspace(c) .

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