Un ejemplo de un comentario útil

Un ejemplo de un comentario útil







Los buenos libros de programación dicen que el código debe ser autodocumentado. Y se necesitan comentarios cuando se está haciendo algo que no es trivial. Nuestro equipo comparte esta opinión, y recientemente nos encontramos con un fragmento de código que lo demuestra perfectamente.







El código que veremos a continuación se escribió en el curso del trabajo en el artículo "El manejo de fechas atrae errores o 77 defectos en Qt 6 ".







El analizador PVS-Studio llamó la atención sobre este fragmento de código, emitiendo una advertencia: V575 [CWE-628] La función 'memcpy' no copia toda la cadena. Utilice la función 'strcpy / strcpy_s' para preservar el nulo del terminal. qplaintestlogger.cpp 253. En realidad, aquí está:







const char *msgFiller = msg[0] ? " " : "";
QTestCharBuffer testIdentifier;
QTestPrivate::generateTestIdentifier(&testIdentifier);
QTest::qt_asprintf(&messagePrefix, "%s: %s%s%s%s\n",
                   type, testIdentifier.data(), msgFiller, msg,
                   failureLocation.data());

// In colored mode, printf above stripped our nonprintable control characters.
// Put them back.
memcpy(messagePrefix.data(), type, strlen(type));

outputMessage(messagePrefix.data());
      
      





Observe la llamada a la función memcpy . Por sí mismo, este código plantea dos preguntas a la vez:







  1. ¿Por qué se está escribiendo algo en un búfer cuyo contenido se acaba de generar usando una función similar a printf?
  2. ¿Ciertamente no es un error que el terminal cero no se copie? Esto es exactamente lo que no le gusta al analizador.


, . .







. , . .







:







char buf[1024];

if (result.setByMacro) {
  qsnprintf(buf, sizeof(buf), "%s%s%s%s%s%s\n", buf1, bufTag, fill,
            buf2, buf2_, buf3);
} else {
  qsnprintf(buf, sizeof(buf), "%s%s%s%s\n", buf1, bufTag, fill, buf2);
}

memcpy(buf, bmtag, strlen(bmtag));
outputMessage(buf);
      
      





. . , . , memcpy. , , buf1, bmtag. , . .







, : Andrey Karpov. One Useful Comment.








All Articles