Mempelajari peringatan dari penganalisa PVS-Studio dalam proses memeriksa berbagai proyek terbuka, kami berulang kali memastikan seberapa berguna alat ini. Penganalisa kode sangat penuh perhatian dan tidak pernah lelah. Ini menunjukkan kesalahan yang menyelinap pergi bahkan dengan peninjauan kode yang cermat. Pertimbangkan kasus lain yang serupa.
Terakhir kali saya menulis
catatan yang sama , mempelajari kode sumber dari proyek StarEngine: 2D Game Engine. Sekarang analisa telah menunjukkan keunggulannya atas saya selama verifikasi kerangka Qt.
Terakhir kali kami
menguji kerangka Qt pada 2014. Banyak waktu berlalu, proyek berubah, dan banyak diagnostik baru muncul di penganalisa PVS-Studio. Jadi, sangat mungkin untuk menulis artikel lain, yang saya lakukan.
Menulis contoh kesalahan yang menarik, saya menemukan kode ini:
QWindowsCursor::CursorState QWindowsCursor::cursorState() { enum { cursorShowing = 0x1, cursorSuppressed = 0x2 }; CURSORINFO cursorInfo; cursorInfo.cbSize = sizeof(CURSORINFO); if (GetCursorInfo(&cursorInfo)) { if (cursorInfo.flags & CursorShowing)
PVS-Studio mengeluarkan peringatan untuk kode ini:
V616 CWE-480 'CursorShowing' bernama konstan dengan nilai 0 digunakan dalam operasi bitwise. qwindowscursor.cpp 669
Versi PVS-Studio yang tidak stabil digunakan untuk verifikasi, jadi keyakinan saya pada alat analisis itu goyah. "Oh, sesuatu yang kami hancurkan dalam mekanisme untuk memproses transfer yang tidak disebutkan namanya," aku menghela nafas, dan menulis kasus ini ke bugtracker sebagai kesalahan yang mengarah ke false positive.
Saya benar-benar yakin bahwa penganalisis itu salah. Lagi pula, dengan hanya beberapa baris di atas tertulis bahwa konstanta
CursorShowing adalah 1.
Pada saat yang sama, saya berusaha untuk berhati-hati! Saya memeriksa kode beberapa kali untuk memastikan bahwa alat analisa itu salah. Saya merancang potongan kode ini dan pesan yang sesuai sebagai kesalahan di bugtracker.
Saya melakukan review menyeluruh dari sepotong kecil kode ini dan mengacaukannya. Penganalisa itu benar, bukan orangnya.
Dalam studi terperinci tentang situasi, ternyata konstanta
cursorShowing yang disebutkan di
atas , dan konstanta
CursorShowing digunakan dalam kondisi tersebut. Perbedaannya hanya pada huruf pertama! Di satu tempat huruf kecil, dan di modal lain.
Mengapa kompilasi kode? Karena konstanta
CursorShowing juga ada. Ini pengumumannya:
class QWindowsCursor : public QPlatformCursor { public: enum CursorState { CursorShowing, CursorHidden, CursorSuppressed }; .... }
Seperti yang Anda lihat, konstanta
CursorShowing adalah 0. Oleh karena itu, penganalisa PVS-Studio benar dalam mengatakan bahwa kondisi
(cursorInfo.flags & CursorShowing) tidak masuk akal. Kondisinya selalu salah.
Penganalisa menemukan kesalahan ketik yang luar biasa. Cinta analisis kode statis! :)

Jika Anda ingin berbagi artikel ini dengan audiens yang berbahasa Inggris, silakan gunakan tautan ke terjemahan: Andrey Karpov.
Sekali lagi alat analisa PVS-Studio terbukti lebih penuh perhatian daripada seseorang .