Rilis PVS-Studio 6.26

PVS-Studio 6.26

Biasanya kami tidak menulis catatan tentang rilis versi baru alat analisa PVS-Studio. Namun, rilis baru ini menyertakan banyak perubahan menarik terkait analisis kode C dan C ++, yang ingin kami beri tahu pengguna kami.

Java segera hadir


Sejujurnya, inovasi terbaru dan paling menarik di PVS-Studio masih tersembunyi. Maksud saya dukungan di penganalisa bahasa Java. Belum ada versi beta publik dari PVS-Studio untuk Java, tetapi akan segera tersedia. Jika Anda ingin mengambil bagian dalam pengujiannya, Anda dapat menulis kepada kami untuk mendukung (pilih: Saya ingin penganalisis untuk Java).

Diagnosis baru untuk C dan C ++


Dalam versi baru, kami sedikit terhanyut dan segera menambahkan 15 diagnostik tujuan umum untuk C dan C ++ (V1021-V1035). Dalam rilis kecil, begitu banyak diagnostik tidak pernah ditambahkan sekaligus. Rincian lebih lanjut tentang masing-masing diagnostik dapat ditemukan dalam dokumentasi . Menurut pendapat saya, yang paling menarik di antara diagnostik baru adalah:

  • V1026. Variabel bertambah dalam loop. Perilaku yang tidak terdefinisi akan terjadi jika integer yang ditandatangani ditandatangani.
  • V1033. Variabel dideklarasikan sebagai otomatis dalam C. Tipe standarnya adalah int.

Diagnostik V1026 dibuat berdasarkan diskusi di forum linux.org.ru. Pemrogram mengeluh tentang kesalahan dalam kompiler GCC 8, tetapi ternyata kemudian, kesalahan adalah kode yang salah, yang mengarah ke perilaku yang tidak terdefinisi. Mari kita lihat kasus ini.

Catatan Dalam diskusi asli, variabel s adalah tipe const char * s . Selain itu, pada platform target, tipe char tidak ditandatangani. Oleh karena itu, untuk kejelasan, saya segera menulis dalam contoh bahwa tipe pointer adalah const unsigned char * .

int foo(const unsigned char *s) { int r = 0; while(*s) { r += ((r * 20891 + *s *200) | *s ^ 4 | *s ^ 3) ^ (r >> 1); s++; } return r & 0x7fffffff; } 

Kompiler tidak menghasilkan kode untuk operator bitwise AND (&). Karena itu, fungsi mengembalikan nilai negatif, meskipun ini tidak boleh terjadi pada niat programmer.

Pengembang percaya bahwa ini adalah kesalahan dalam kompiler. Tetapi programmer yang menulis kode seperti itu sebenarnya salah. Fungsi tidak berfungsi sebagaimana mestinya karena fakta bahwa perilaku tidak terdefinisi terjadi di dalamnya.

Kompiler melihat bahwa jumlah tertentu dipertimbangkan dalam variabel r . Overflow dari variabel r seharusnya tidak terjadi. Jika tidak, ini adalah perilaku yang tidak ditentukan yang tidak boleh dipertimbangkan dan dipertimbangkan oleh penyusun. Jadi, kompiler percaya bahwa karena nilai dalam variabel r setelah akhir siklus tidak boleh negatif, operasi r & 0x7fffffff untuk me-reset bit tanda berlebihan dan kompiler hanya mengembalikan nilai variabel r dari fungsi.

Diagnostik V1026 hanya dirancang untuk mendeteksi kesalahan tersebut. Untuk memperbaiki kode, cukup membaca hash menggunakan variabel yang tidak ditandatangani. Versi kode yang diperbaiki:

 int foo(const unsigned char *s) { unsigned r = 0; while(*s) { r += ((r * 20891 + *s *200) | *s ^ 4 | *s ^ 3) ^ (r >> 1); s++; } return (int)(r & 0x7fffffff); } 

Sekarang mari kita lihat diagnostik V1033 lainnya. Sangat menarik bahwa penyebab kemungkinan kesalahan adalah kata kunci otomatis baru, yang muncul di C ++ 11. Dan itu bukan inovasi dari bahasa C ++ 11 itu sendiri yang bersalah, tetapi nuansa dari rencana psikologis :). Saya akan jelaskan sekarang. Lihatlah kode ini:

 float d = 3.14f; int i = 1; auto sum = d + i; 

Melihatnya sebagai kesalahan? Pikirkan tentang itu. Ini gambar sehingga Anda tidak segera membaca teks lebih lanjut.

Waktunya berpikir

Coba tebak apa yang salah? Jika tidak, berikut ini beberapa informasi lebih menarik. Variabel penjumlahan akan menjadi 4, bukan 4.14. Mengapa

Xs

Sekarang pembaca akan mengatakan bahwa itu adalah teka-teki yang tidak jujur! Masalahnya adalah ini bukan C ++, tetapi C.

Itu terjadi bahwa suatu proyek menggunakan C ++ dan C lama yang baik. Pemrogram terbiasa menggunakan otomatis dalam C ++ dan secara tidak sengaja dapat menggunakan kata ini dalam C. Tapi itu berarti sesuatu yang lain di sana:

otomatis

Mendefinisikan variabel lokal sebagai memiliki masa hidup lokal. Kata kunci otomatis menggunakan sintaks berikut:

 [auto] data-definition; 

Karena masa pakai lokal adalah default untuk variabel lokal, kata kunci otomatis sangat jarang digunakan.

Ternyata jumlah variabel adalah tipe int , dan itulah sebabnya nilainya akan menjadi 4.

Unicorn tertawa

Meskipun kesalahannya mungkin tampak eksotik, pada kenyataannya, dalam proyek yang menggunakan campuran file C dan C ++, itu sangat mudah untuk dilakukan. Karena itu, ketika menganalisis file-C, PVS-Studio memperingatkan konstruksi mencurigakan tersebut.

Inovasi lainnya


Ditambahkan kemampuan untuk memeriksa proyek untuk sistem pembangunan Waf .

Kami terus mengembangkan alat analisis terhadap sistem tertanam. Versi ini menambahkan dukungan verifikasi proyek untuk GNU Arm Embedded Toolchain, kompiler Arm Embedded GCC.

Saat menganalisis proyek untuk kompiler Visual C ++ (cl.exe, proyek vcxproj untuk Visual Studio / Standalone), laporan penganalisa sekarang menyimpan register di jalur ke file yang diperiksa. Perbaikan dari samping terlihat lebih mudah dari yang sebenarnya. Saat preprocessing file, kompiler cl.exe merusak case dalam nama file. Dan Anda harus mengembalikannya ke penganalisis.

Menambahkan kemampuan untuk menggunakan file pvsconfig dari CLMonitor / Standalone di Windows.

Mode analisis tambahan telah ditambahkan untuk modul pvs-studio-analzyer / CMake. Modul PVS-Studio CMake sekarang dapat digunakan pada Windows untuk proyek-proyek menggunakan kompiler Visual C ++ (cl.exe).

Menambahkan dukungan untuk analisis tambahan untuk proyek .NET Core / .NET Standard Visual Studio.

Tautan situs


  1. PVS-Studio. Riwayat versi .
  2. Andrey Karpov. Perilaku yang tidak terdefinisi lebih dekat dari yang Anda pikirkan .
  3. Will Dietz, Peng Li, John Regehr, dan Vikram Adve. Memahami Overflow Integer di C / C ++ .
  4. Egor Bredikhin. Pengembangan analisa statis baru: PVS-Studio Java .

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


All Articles