Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

251
Visualizações
¿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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda