Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

250
Views
¿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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!