
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:
- ¿Por qué se está escribiendo algo en un búfer cuyo contenido se acaba de generar usando una función similar a printf?
- ¿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.