Contoh komentar yang membantu

Contoh komentar yang membantu







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:







  1. Mengapa ada sesuatu yang ditulis ke buffer yang isinya baru saja dibuat menggunakan fungsi seperti printf?
  2. 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.








All Articles