優れたプログラミングの本は、コードは自己文書化する必要があると言っています。そして、重要なことが行われているところではコメントが必要です。私たちのチームはこの意見を共有しており、最近、これを完全に実証するコードに出くわしました。
次に説明するコードは、「日付処理がQt6でエラーまたは77の欠陥を引き付ける」という記事の作業の過程で書き出されました。
PVS-Studioアナライザーは、このコードフラグメントに注意を引き、警告を発行しました。V575[CWE-628]「memcpy」関数は文字列全体をコピーしません。'strcpy / strcpy_s'関数を使用して、ターミナルnullを保持します。qplaintestlogger.cpp 253.実際、ここにあります:
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());
memcpy関数の呼び出しに注意してください。このコード自体は、一度に2つの質問を提起します。
- printfのような関数を使用して内容が生成されたばかりのバッファに何かが書き込まれるのはなぜですか?
- 確かに、端子ゼロがコピーされないという間違いではありませんか?これはまさにアナライザーが気に入らないことです。
, . .
. , . .
:
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.