Kesalahan dengan arahan #line dalam kompiler Visual C ++

image1.png

Arahan #line ditambahkan oleh preprocessor dan kemudian dapat digunakan untuk memahami file mana dan baris bagian tertentu dari kode dalam file preprocessed milik. Arahan #line memberi tahu alat kode untuk mengubah nomor baris tersimpan internal dan nama file kompiler ke nomor baris yang ditentukan. Baris berikut sudah akan dihitung relatif terhadap posisi yang diberikan. Preprocessing eksplisit terutama digunakan untuk debugging atau oleh berbagai generator. Dalam kasus apa pun, kesalahan dalam fungsi semacam itu dapat menyebabkan berbagai konsekuensi negatif. Salah satu masalah ini terjadi pada pengguna PVS-Studio di Visual Studio 2019.

Riwayat dan deskripsi kesalahan


Arahan #line adalah bagian penting dari file pracroses yang digunakan oleh penganalisa PVS-Studio untuk mengeluarkan peringatan pada baris kode pengguna yang diperlukan. Di sinilah kisah pencarian kesalahan dimulai.

Salah satu pengguna kami dengan basis kode besar mulai menerjemahkan seluruh proyek dari Platform Toolset versi v141 ke v142 di Visual Studio 2019. Setelah itu, dalam hasil analisis, gelombang peringatan V002 muncul dan beberapa puluh peringatan lainnya dikeluarkan untuk baris kode yang salah (kesalahan satu baris) )

Diagnostik V002 hanya mendeteksi situasi seperti itu (penomoran baris tidak benar). Ini biasanya terjadi karena makro multi-baris atau arahan preprosesor lainnya (mis. #Pragma). Masalahnya tidak sering terjadi, tetapi terutama pada kompiler dari Microsoft. Gelombang masalah pada satu proyek seperti itu tidak terduga, karena sistem pengujian kami tidak menunjukkan adanya masalah serius seperti itu, dan kami mulai men-debug penganalisa pada file pengguna yang sudah diproses sebelumnya.

Setelah beberapa jam melakukan debug, kami menemukan bahwa penganalisa sudah bekerja dengan data yang salah tentang baris kode dan mampu membuat contoh uji:

#define MACRO(a, b)              // line1
                                 // line2
int main(int argc, char* argv[]) // line3
{                                // line4
    MACRO("Some string",         // line5
        42);                     // line6
    return 0;                    // line7 <=
}

File yang sudah diproses adalah sebagai berikut:

#line 1 "D:\\_Tests\\TestApp\\Project2\\rnd_bs.cpp"


int main(int argc, char* argv[])
{
  ;
#line 8 "D:\\_Tests\\TestApp\\Project2\\rnd_bs.cpp"
  return 0;
}

The pernyataan kembali adalah pada 7 baris dalam file sumber, dan titik-titik preprocessor ke -8 line. Kesalahan ini terjadi di preprocessor, mungkin karena makro multi-line.

Versi Rilis Dirilis


Pada saat penulisan, masalah ini relevan untuk versi terbaru dari Visual Studio, hingga versi 16.4.3 (tanggal 14 Januari 2020). Kami membuka Laporan Bug " Arahan # line tidak valid setelah preprocessing (VS2019, v142) " dan setelah 4 hari menerima jawaban yang menarik:

Masalah ini telah diidentifikasi sebagai duplikat dari umpan balik yang dilaporkan sebelumnya yang ditautkan di sini: developercommunity.visualstudio.com/content/problem /738407/preprocessor-generates-incorrect-line-information.html . Jika Anda melaporkan atau memilih di sini, suara Anda telah diterapkan pada masalah aslinya. Semua orang dapat menambahkan suara mereka secara langsung di umpan balik tertaut di atas. Voting membantu meningkatkan prioritas masalah dengan mengkonsolidasikan dampak pelanggan di bawah satu umpan balik. Terima kasih!

Ternyata masalah ini telah dilaporkan, dan pada 18 September 2019 - hampir setengah tahun yang lalu: " Preprocessor menghasilkan informasi garis yang salah ". Pengguna memberikan contoh kode serupa untuk mereproduksi kesalahan. Menurut penulis, kesalahan ada setidaknya dengan Visual Studio 2019 16.2.

Tidak diketahui apakah ini kebetulan atau tidak, tetapi setelah beberapa hari aktivitas kami, kesalahan tersebut diberi status Tetap Rilis Tertunda .

Pada 19 Mei 2020, versi revisi dari Visual Studio 2019 16.6.0 dirilis. Kami merekomendasikan bahwa semua pengguna PVS-Studio beralih ke sana.


Jika Anda ingin berbagi artikel ini dengan audiens yang berbahasa Inggris, silakan gunakan tautan ke terjemahan: Svyatoslav Razmyslov. Bug yang Disebabkan oleh Petunjuk #line dalam Visual C ++ Compiler .

All Articles