Ein Beispiel für einen hilfreichen Kommentar

Ein Beispiel für einen hilfreichen Kommentar







Gute Programmierbücher sagen, dass Code sich selbst dokumentieren sollte. Und Kommentare sind erforderlich, wenn etwas nicht Triviales getan wird. Unser Team teilt diese Meinung und kürzlich sind wir auf einen Code gestoßen, der dies perfekt demonstriert.







Der Code, den wir uns als nächstes ansehen werden, wurde im Verlauf der Arbeit am Artikel " Datumsbehandlung zieht Fehler oder 77 Fehler in Qt 6 an " geschrieben.







Der PVS-Studio-Analysator machte auf dieses Codefragment aufmerksam und gab eine Warnung aus: V575 [CWE-628] Die Funktion 'memcpy' kopiert nicht die gesamte Zeichenfolge. Verwenden Sie die Funktion 'strcpy / strcpy_s', um das Terminal null beizubehalten. qplaintestlogger.cpp 253. Eigentlich ist es hier:







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());
      
      





Beachten Sie den Aufruf der memcpy- Funktion . Dieser Code wirft für sich genommen zwei Fragen gleichzeitig auf:







  1. Warum wird etwas in einen Puffer geschrieben, dessen Inhalt gerade mit einer printf-ähnlichen Funktion generiert wurde?
  2. Sicher kein Fehler, dass Terminal Null nicht kopiert wird? Genau das mag der Analysator nicht.


, . .







. , . .







:







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