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

111
Visualizações
advertencia de gcc para diferentes tipos de devolución

He escrito una biblioteca en C que ahora se utilizará en una placa de procesador integrada. Necesito reducir la huella de la memoria, así que iba a cambiar el tipo de devolución de algunas funciones de int a char (solo se usa para marcar errores).

Cambiar el tipo de devolución pero no cambiar la variable devuelta no produce una advertencia. ¿Hay alguna forma de configurar esto en gcc, ya que quiero asegurarme de haber capturado todas las instancias?

 char processSomething (SomeType *something) { int result = 0; ... do stuff ... return result; /* no warning */ }

Gracias

19 de junio: He agregado la conversión -W que ha resaltado algunas cosas interesantes. Dos preguntas con esto. Una de mis funciones tomo una cadena hexadecimal de dos caracteres y la convierto a decimal usando

carácter decimal;

 decimal = hexstring [0] - '0' << 4 + hexstring [1] - '0'; // for 0 to 9

se queja de la conversión de int a char y, por lo que puedo deducir, los operadores '-', '+' y '<<' parecen convertirse implícitamente a int. ¿Es esto correcto o estoy interpretando mal la advertencia? ¿O hay una mejor manera de hacer esto?

Además, cuando se usa strtol en un int (se queja de 'int largo' a 'int'), pero puedo garantizar que el valor no superará ni siquiera el tamaño de int corto, ¿es seguro encasillar? Como en ¿truncará el extra (y con suerte cero bytes) del largo? ¿O esto depende de la endianidad?

Gracias

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

En este caso específico, Wconversion debería darte la advertencia que deseas, en mi caso de prueba simple ( verlo en vivo ):

 char func() { int x = 10 ; return x ; } int main() {}

Recibo la siguiente advertencia:

advertencia: la conversión a 'char' desde 'int' puede alterar su valor [-Wconversion]

over 4 years ago · Santiago Trujillo Relatório

0

Esta es una muy mala idea: char tiene un cierto tamaño en la mayoría de los sistemas integrados (generalmente 1 byte, por lo que en realidad es un unsigned char ) y si termina configurando su int result = 256 de alguna manera, se desbordará y devolverá 0. Su error simplemente se convirtió en un éxito. Crashy crashy (con suerte). Peor aún, tal vez mate a alguien con su dispositivo integrado.

Sé que está tratando de arreglar esto, pero incluso devolver números mágicos es peligroso.

En su lugar, declare un tipo de enumeración que sea un error. Le dará seguridad de tipo (hasta cierto punto) y creará automáticamente el tamaño de retorno correcto para sus funciones.

 typedef enum status { STATUS_OK = 0, STATUS_ERR1, STATUS_ERR2, // ... etc ... } status_t; status_t processSomething (SomeType *something) { status_t result = STATUS_OK; ... do stuff ... return result; }

Esto es mucho más seguro y el compilador asignará solo 1 byte para sus devoluciones hasta que tenga demasiados para caber, y solo entonces lo hará más grande. Tomado del estándar C actual (C99): http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf

6.7.2.2 Especificadores de enumeración [...] Restricciones La expresión que define el valor de una constante de enumeración debe ser una expresión de constante entera que tenga un valor representable como un int. [...] Cada tipo enumerado será compatible con char, un tipo entero con signo o un tipo entero sin signo. La elección del tipo está definida por la implementación, pero debe poder representar los valores de todos los miembros de la enumeración.

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