Tratando con enteros sin signo
Sé que los enteros sin signo son infames y generalmente evitados por los desarrolladores de C++. Tengo una clase con dos variables miembro de tipo int
que no deben contener valores negativos:
.
.
.
private:
int m_Y_AxisLen;
int m_X_AxisLen;
.
.
.
He diseñado la lógica de las funciones miembro de manera que evita cualquier entrada de números negativos. Así que me he asegurado de que esas dos variables miembro no tengan valores negativos.
Pero esto también genera algunas advertencias cuando uso PVS-Studio. Por ejemplo, aquí:
for (int row = 0; row < getY_AxisLen(); ++row)
{
for (int column = 0; column < getX_AxisLen() - 1; ++column)
{
if (m_characterMatrix[row][column] == getFillCharacter())
{
m_characterMatrix[row][column] = fillCharacter;
}
}
}
PVS-Studio me culpa por los índices row
y column
no siendo del tipo memsize
. Probablemente eso signifique que debería haber utilizado std::size_t row
y std::size_t column
¿no?
Pero si lo hubiera hecho de esa manera, seguiría quejándose y diría que comparar un tipo integral sin signo con getY_AxisLen()
(que devuelve un int
) es peligroso.
Así que esta es la razón por la que quiero reescribir partes de mi clase para cambiar a esto:
private:
uint32_t m_Y_AxisLen;
uint32_t m_X_AxisLen;
Humildemente, busco ideas y consejos de profesionales que hayan enfrentado este tipo de problemas antes. ¿Cuál sería su enfoque cuando se trata de estos problemas?
davy.ai
Como experto en TI especializado en c++, arrays, unsigned-integer, static-code-analysis y PVS-Studio, recomendaría utilizar
std::size_t
pararow
ycolumn
como sugiere PVS-Studio. También puedes considerar utilizaruint32_t
param_Y_AxisLen
ym_X_AxisLen
para evitar las advertencias sobre la comparación de tipos enteros sin signo congetY_AxisLen()
.Para evitar valores de entrada negativos, puedes utilizar
unsigned int
ostd::size_t
como tipos de parámetro para las funciones miembro que aceptan valores de entrada param_Y_AxisLen
ym_X_AxisLen
. También puedes considerar rediseñar tu clase para utilizarstd::vector
en lugar de arrays y aprovechar su verificación de límites incorporada.En general, mi enfoque sería priorizar la corrección y legibilidad sobre el rendimiento cuando se trata de lidiar con enteros sin signo e índices de array. Es importante evitar posibles errores y comportamientos indefinidos que pueden surgir al utilizar enteros sin signo incorrectamente, y también es importante hacer que tu código sea fácil de entender y mantener tanto para ti como para otros desarrolladores.