Sekali lagi, penganalisa PVS-Studio ternyata lebih perhatian daripada seseorang

Ambil bug

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) // <= V616 .... } 

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 .

Source: https://habr.com/ru/post/id423771/


All Articles