
Buku pemrograman yang bagus mengatakan bahwa kode harus mendokumentasikan diri sendiri. Dan komentar dibutuhkan ketika sesuatu yang tidak sepele sedang dilakukan. Tim kami membagikan pendapat ini, dan baru-baru ini kami menemukan kode yang dengan sempurna menunjukkan hal ini.
Kode yang akan kita lihat selanjutnya telah ditulis dalam proses pengerjaan artikel " Penanganan Tanggal Menarik Kesalahan atau 77 Cacat di Qt 6 ".
Penganalisis PVS-Studio memperhatikan fragmen kode ini, mengeluarkan peringatan: V575 [CWE-628] Fungsi 'memcpy' tidak menyalin seluruh string. Gunakan fungsi 'strcpy / strcpy_s' untuk mempertahankan terminal null. qplaintestlogger.cpp 253. Sebenarnya, ini dia:
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());
Perhatikan panggilan ke fungsi memcpy . Dengan sendirinya, kode ini menimbulkan dua pertanyaan sekaligus:
- Mengapa ada sesuatu yang ditulis ke buffer yang isinya baru saja dibuat menggunakan fungsi seperti printf?
- Tentu bukan kesalahan bahwa terminal nol tidak disalin? Inilah yang tidak disukai penganalisis.
, . .
. , . .
:
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.