Sangat memalukan untuk opini tentang penganalisis kode statis

Alat analisis kode statis telah berkembang jauh di depan. Ini sama sekali bukan "linter" yang digunakan secara aktif 20 tahun lalu. Namun, banyak yang masih menyebutnya sebagai alat yang sangat sederhana. Memalukan. Ini memalukan baik untuk metodologi analisis kode secara umum dan untuk alat PVS-Studio.







Alasan sedikit sedih adalah komentar di salah satu artikel kami. Di artikel ini, ditulis bahwa penganalisis mendeteksi kesalahan ketik dengan mengeluarkan peringatan ke kode berikut:



if (A[0] == 0)
{
  X = Y;
  if (A[0] == 0)
    ....
}


Penganalisis mengatakan bahwa kondisi kedua selalu benar. Memang, jika Anda memeriksa tubuh fungsi, menjadi jelas bahwa elemen lain dari array harus diperiksa.



Mengenai hal ini, sebuah komentar diterima kira-kira sebagai berikut:
Ya, penganalisis menunjukkan kesalahan di sini. Namun secara umum, peringatan ini tidak benar. Bagaimanapun, antara dua pemeriksaan identik, nilai elemen dapat berubah, dan kemudian pemeriksaan kedua akan masuk akal.
Saya sedih. Pemrogram masih berpikir bahwa penganalisis kode dibangun di atas ekspresi reguler. Seperti, kami menemukan dua bersarang identik jika dan bersumpah.



Biasanya, penganalisis statis modern memantau perubahan nilai variabel. Jika variabel tidak berubah, akan ada pesan. Jika berubah, tidak akan ada pesan. Untuk ini, teknologi analisis aliran data digunakan.



Inilah yang dilakukan penganalisis statis PVS-Studio. Mari kita lihat contoh sintetis berikut:



char get();
int foo(char *p, bool arg)
{
    if (p[1] == 1)
    {
        if (arg)
            p[0] = get();
        if (p[1] == 1)          // Warning
            return 1;
    }
    if (p[2] == 2)
    {
        if (arg)
            p[2] = get();
        if (p[2] == 2)          // Ok
            return 2;
    }
    return 3;
}


Kode tersebut berisi dua blok serupa. Di satu, variabel yang diperiksa tidak berubah, dan di detik itu berubah. Oleh karena itu, penganalisis mengeluarkan peringatan hanya untuk blok pertama: V547 Ekspresi 'p [1] == 1' selalu benar.



Programmer tidak perlu khawatir. Alat modern canggih dan hanya mengeluarkan peringatan untuk kode yang benar-benar mencurigakan. Ada positif palsu, tetapi, sebagai aturan, mereka dikaitkan dengan adanya kode yang membingungkan, yang bisa sulit dipahami bahkan bagi seseorang.





Tautan tambahan







Jika Anda ingin berbagi artikel ini dengan audiens berbahasa Inggris, silakan gunakan tautan terjemahan: Andrey Karpov. Pendapat yang Mengesalkan tentang Penganalisis Statis .



All Articles