¿Debo deshabilitar el comstackdor de C firmado / sin firmar la advertencia de falta de coincidencia?

El comstackdor de Microsoft C advierte cuando intenta comparar dos variables, una está firmada y la otra no está firmada. Por ejemplo:

int a; unsigned b; if ( a < b ) { // warning C4018: '<' : signed/unsigned mismatch } 

¿Esta advertencia, en la historia del mundo, alguna vez ha captado un error real? ¿Por qué está allí, de todos modos?

Oh tiene Pero al revés. Ignorar esa advertencia me causó un gran dolor de cabeza un día. Estaba escribiendo una función que trazaba un gráfico y mezclaba variables con y sin signo. En un lugar, comparé un número negativo con uno sin firmar:

 int32_t t; ... uint32_t ut; ... if(t < ut) { ... } 

¿Adivina qué pasó? El número firmado se promovió al tipo sin signo y, por lo tanto, fue mayor al final, a pesar de que originalmente era inferior a 0. Me tomó un par de horas hasta que encontré el error.

Nunca ignore las advertencias del comstackdor.

Si tiene que hacer la pregunta, no sabe lo suficiente acerca de si es seguro desactivarla, por lo que la respuesta es No.

No lo deshabilitaría. No asumo que siempre sé mejor que el comstackdor (no solo porque a menudo no lo hago), y más particularmente porque a veces cometo errores por descuido cuando un comstackdor no lo hace.

Debe cambiar a y b para usar ambos tipos con signo, o ambos usar tipos sin signo. Pero eso puede no ser práctico (por ejemplo, tal vez fuera de su control).

La advertencia está ahí para detectar comparaciones entre un entero con signo con un valor negativo y un entero sin signo: si las magnitudes de ambos números son pequeñas, el primero se considerará (incorrectamente) más grande que el último.

Los operadores binarios a menudo convierten ambos tipos al mismo antes de hacer la comparación, ya que uno no tiene firma, también convertirá el int en unsigned. Normalmente esto no causará demasiados problemas, pero si su int es un número negativo, esto causará errores en las comparaciones.

por ejemplo, -1 es igual a 4294967295 cuando se convierte de firmado a unsigned, ahora compárelo con 100 (unsigned)

Las advertencias están ahí por un propósito … ¡Hacen que pienses mucho en tu código!

Personalmente, siempre emitiría explícitamente el signo firmado – sin signo y sin signo -> firmado si es posible. Al hacer esto, se asegura de tomar posesión de la transacción y de saber qué va a suceder. Me doy cuenta de que puede que no siempre sea posible, dependiendo del proyecto para hacer esto, pero siempre apunte a 0 advertencias del comstackdor … ¡solo puede ayudar!

He estado escribiendo código más de lo que me gustaría admitir. A partir de la experiencia personal, ignorar las advertencias de comstackdores aparentemente pedantes a veces puede producir resultados muy desagradables.

Si te molestan y aceptas / entiendes la situación, establece un reparto y sigue adelante.

Eventualmente, estas cosas pasan de un matiz pasado por alto a una decisión consciente al diseñar un nuevo código. El resultado deja menos espacio para que los casos de mickmouse corner arruinen su día o el de sus clientes y, en general, un software de mejor calidad.

Incluso he configurado el comstackdor para hacer de esa advertencia un error de comstackción. Por las razones de todos los otros chicos ya mencionados.

Si alguna vez encuentro un desajuste firmado / sin firmar, me pregunto por qué elegí una “firmeza” diferente. Por lo general es un error de diseño.

@gimel La explicación acerca de disparar la pierna completa que se encuentra detrás de tu enlace es realmente buena para este problema.

– “Alguien que evita los problemas simples puede simplemente dirigirse a uno no tan simple”.

En realidad, esto siempre es cierto cuando se convierte entre diferentes tipos y no se comprueban los valores que podrían dañarlo.

/ Johan

Actualización: la forma correcta de convertir de uint a int es comparar los valores con limits.h, o algo así. (Pero rara vez lo hago yo mismo, incluso si sé que debería … 🙂

Creo que es mejor convertir su número sin firma en un número firmado (antes de la comparación). En lugar de al revés.

Solo una de las muchas formas en que C te permite dispararte en el pie : es mejor que sepas lo que estás haciendo. La cita de C se atribuye a Bjarne Stroustrup , creador de C ++ .

    Intereting Posts