@ agnasg

agnasg


No confies demasiado en google… o en stackoverflow… o en nada

16-11-2016 4:58 AM

No sé cómo se llama el proceso mental que sufren algunos programadores (me incluyo, por supuesto) cuando, usualmente después de 10 horas de trabajo en un algoritmo, las cosas comienzan a ponerse bizarras y confusas. Me refiero a casos como el siguiente:

[code language=”cpp”]
for (int i = 1;i <= 4; i++) {
switch (i) {
case 1: execute1 (); break;
case 2: execute2 (); break;
case 3: execute3 (); break;
case 4: execute4 (); break;
}
} [/code]

El algoritmo comienza a complicarse y aparecen monstruos a veces inofensivos, a veces destructivos, definitivamente risibles.
Ayer estaba trabajando en un complicado sistema que se conecta a un webserver y devuelve información via https, pero con un nivel adicional de encriptación por seguridad (en este caso los usuarios del sistema son capaces de cualquier cosa, incluyendo lo imposible). Pues cuando todo parecía funcionar los códigos de retorno comenzaron a llegar con basura (en realidad todo el tiempo estaban llegando con basura pero yo no había llegado aún a ese punto)
Luego de una hora de debugguing llegué a este código:

[code language=”cpp”]
QByteArray array = QString(source.c_str()).toLatin1();
strncpy ((char*)buffer, array.data(), source.length());
[/code]

Recordé que días atrás estaba buscando la forma de pasar de QString a unsigned char * de una forma estándard ( o cómo dice la página de stackoverflow, a clean way) El googleo me llevó a esta página: http://stackoverflow.com/questions/17936160/clean-way-to-convert-qstring-to-char-not-const-char. Quizás lo que sea que estaba tratando de hacer en aquél momento funcionó porque el código de conversión utilizando QByteArray y toLatin1 permaneció ahí, mas no el argumento. Este código toma un std::string, lo convierte a QString y luego a unsigned char * (ups, strncpy no acepta en un compilador estricto unsigned char * así que hay que hacer un cast)

El resultado es que 0xc4 se transformaba en 0xffffffc4. Supongo que este código tenía sentido cuando originalmente era un QString, pero cuando el argumento pasó a ser un std::string, las cosas se volvieron, ofuscosas.

Para hacer el cuento largo corto el código defectuoso se transformó en:

[code language=”cpp”]
for (int i = 0; i < source.length();i++) {
buffer[i] = source[i] &amp; 0xff;
}
[/code]

2 horas después. Gracias stackoverflow. O quizás gracias sindrome de la ofuscación del código después de 10 horas de trabajo.