Metodologi analisis statis menggunakan berbagai teknologi. Salah satunya adalah preprocessing file segera sebelum analisisnya. File pracroses dibuat oleh kompiler yang berjalan dalam mode operasi khusus. Sayangnya, mode ini tidak diuji dengan baik, seperti pengalaman kami selama bertahun-tahun dalam mengembangkan alat analisa kode statis. Dalam catatan ini, saya akan memberikan contoh bug yang baru ditemukan di kompiler C ++ dari Microsoft.
Pendahuluan
Untuk menunjukkan kemampuan analisa statis PVS-Studio, tim kami memeriksa kode sumber proyek Open Source. Ini merupakan
kontribusi signifikan
terhadap kualitas perangkat lunak sumber terbuka, iklan tambahan, dan pengujian penganalisa. Terkadang kami menemukan masalah yang sangat tidak biasa dalam kompiler yang sulit dilakukan di sisi penganalisa. Jadi, seorang rekan baru-baru ini menulis sebuah artikel "
File dengan arahan 'import' (compiler internal error 'msc1.cpp') tidak lagi dianalisis. Apa yang harus saya lakukan? " Untuk membantu pengguna kami dalam memecahkan masalah "asing".
Bagaimana dengan CSS?
Bug yang sama menariknya saya temukan ketika memeriksa sebuah proyek besar. Kompiler Microsoft untuk C / C ++ versi 19.16.27027.1 (Visual Studio v15.9.9) menghasilkan kesalahan ini ketika menganalisis beberapa file:
fatal error C1021: invalid preprocessor command 'tooltiphint'
Jelas, ini bukan arahan preprosesor, tapi apa itu? Ini adalah potongan kode CSS:
#tooltiphint { position: fixed; width: 50em; margin-left: -25em; left: 50%; padding: 10px; border: 1px solid #b0b0b0; border-radius: 2px; box-shadow: 1px 1px 7px black; background-color: #c0c0c0; z-index: 2; }
Setelah melihat fragmen, menjadi jelas bahwa kompiler salah selama preprocessing file, tetapi kode berhasil dikompilasi. Cuplikan kode CSS adalah bagian dari string literal kode C ++. Berikut ini contoh kode yang cukup untuk mengulangi kesalahan:
std::string test = R"<<<( <style type="text/css"> body { color:#000000; background-color:#ffffff } body { font-family:Helvetica, sans-serif; font-size:10pt } #tooltiphint { position: fixed; width: 50em; margin-left: -25em; left: 50%; padding: 10px; border: 1px solid #b0b0b0; border-radius: 2px; box-shadow: 1px 1px 7px black; background-color: #c0c0c0; z-index: 2; } .macro { color: darkmagenta; background-color:LemonChiffon; /* Macros are position: relative to provide base for expansions. */ position: relative; } </style> </head> <body>)<<<";
Fragmen kode di atas tidak mengganggu kompilasi yang berhasil, tetapi, pada saat yang sama, kesalahan terjadi dalam mode preprocessing (flag
/ P ).
Ini adalah kehidupan yang sulit bagi pengembang analisa statis :). Tampaknya PVS-Studio tidak bisa disalahkan, tapi tetap saja kita harus berurusan dengan masalah yang sama. Namun, ini bukan sesuatu yang baru. Beberapa kasus serupa lainnya dapat ditemukan di artikel "
PVS-Studio dan lingkungan yang bermusuhan ."
Kesimpulan
Masalah ini akan dikirim ke pelacak bug resmi, tetapi solusi cepat untuk masalah tersebut hampir tidak mungkin. Misalnya, masalah dengan arahan
#import yang kami identifikasi beberapa bulan lalu, yang saya tulis di awal, akan diperbaiki hanya dalam rilis Visual Studio berikutnya. Karena Rilis Visual Studio 2019 baru akan berlangsung dalam seminggu, kemungkinan besar, bug ini tidak akan diperbaiki pada tanggal ini. Pengguna PVS-Studio juga disarankan untuk menggunakan makro
PVS_STUDIO .

Jika Anda ingin berbagi artikel ini dengan audiens yang berbahasa Inggris, silakan gunakan tautan ke terjemahan: Svyatoslav Razmyslov.
Bagaimana fragmen markup CSS memecahkan kompiler C ++