10 bug teratas dalam proyek C # untuk 2019

Gambar 1

Salam untuk semua pecinta bug. Tahun Baru akan segera tiba, jadi sekarang saatnya mengambil tahun yang akan berlalu. Secara tradisional, peringkat kesalahan paling menarik yang ditemukan oleh tim PVS-Studio di proyek C # terbuka untuk 2019. Apakah kamu siap Kalau begitu mari kita mulai.

Tempat kesepuluh: "Bingung semua orang"


V3066 Kemungkinan urutan argumen yang salah diteruskan ke metode 'AdjustCellBorderStyle': 'isFirstDisplayedRow' dan 'isFirstDisplayedColumn'. DataGridViewComboBoxCell.cs 1934

protected override void OnMouseMove(DataGridViewCellMouseEventArgs e) { .... dgvabsEffective = AdjustCellBorderStyle( DataGridView.AdvancedCellBorderStyle, dgvabsPlaceholder, singleVerticalBorderAdded, singleHorizontalBorderAdded, isFirstDisplayedRow, // <= isFirstDisplayedColumn); // <= .... } 

Kesalahan dari artikel " WinForms: Errors, Holmes ". Alat analisis menunjukkan bahwa ketika meneruskan argumen ke metode, dua argumen terakhir dibalik. Lihatlah deklarasi AdjustCellBorderStyle :

 public virtual DataGridViewAdvancedBorderStyle AdjustCellBorderStyle( DataGridViewAdvancedBorderStyledataGridViewAdvancedBorderStyleInput, DataGridViewAdvancedBorderStyle dataGridViewAdvancedBorderStylePlaceholder, bool singleVerticalBorderAdded, bool singleHorizontalBorderAdded, bool isFirstDisplayedColumn, bool isFirstDisplayedRow) { .... } 

Sepertinya penganalisisnya benar. Seringkali, beberapa argumen sengaja disahkan dalam urutan terbalik, misalnya, untuk menukar beberapa variabel. Tapi sepertinya bukan ini yang terjadi. Pertama, variabel tipe bool bingung. Kedua, nama metode juga umum: tidak ada "Swap" atau "Terbalik". Selain itu, tidak begitu sulit untuk membuat kesalahan seperti ini: orang sering merasakan urutan pasangan baris / kolom berbeda.

Tempat kesembilan: "Yang Tak Terbatas sudah dekat"


V3110 Kemungkinan rekursi tak terbatas di dalam metode 'TryValidateModel'. PrefixedModuleUpdater.cs 48

 public bool TryValidateModel(object model, string prefix) { return TryValidateModel(model, Prefix(prefix)); } 

Kesalahan dari artikel " Mencari dan menganalisis kesalahan dalam kode CMS Orchard ". Telah dibuat kesalahan yang menyebabkan rekursi tak terbatas. Untuk memahami bagaimana kesalahan ini dapat terjadi, Anda perlu melihat kelebihan metode TryValidateModel :

 public bool TryValidateModel(object model) { return _updateModel.TryValidateModel(model); } 

Sangat mungkin bahwa dalam kasus pertama panggilan formulir harus digunakan:

 public bool TryValidateModel(object model, string prefix) { return _updateModel.TryValidateModel(model, Prefix(prefix)); } 

Kode dikompilasi karena _updateModel adalah tipe IUpdateModel , dan kelas saat ini juga mengimplementasikan antarmuka IUpdateModel .

Tempat kedelapan: "Coba, cari"


V3091 Analisis empiris. Mungkin salah ketik ada di dalam string literal: "Id Grup Manajemen." Kata 'Id' mencurigakan. Constants.cs 36

 public class HelpMessages { public const string SubscriptionId = "Subscription Id of the subscription associated with the management"; public const string GroupId = "Management Group Id"; // <= public const string Recurse = "Recursively list the children of the management group"; public const string ParentId = "Parent Id of the management group"; public const string GroupName = "Management Group Id"; // <= public const string DisplayName = "Display Name of the management group"; public const string Expand = "Expand the output to list the children of the management group"; public const string Force = "Force the action and skip confirmations"; public const string InputObject = "Input Object from the Get call"; public const string ParentObject = "Parent Object"; } 

Kesalahan berasal dari artikel " Azure PowerShell:" pada dasarnya tidak berbahaya . "Penganalisa menduga bahwa konstanta GroupName diinisialisasi dengan string kesalahan. Mungkin harus ada sesuatu seperti " Nama Grup Manajemen . " Sulit untuk menilai kekritisan kesalahan ini, tetapi unik jarang sulit dideteksi.

Tempat ketujuh: "Terabaikan"


V3078 Urutan penyortiran asli akan hilang setelah panggilan berulang ke metode 'OrderBy'. Gunakan metode 'ThenBy' untuk mempertahankan penyortiran asli. GridModel.Selection.cs 107

 internal partial class GridModel { private void BuildCellSelectionRegions(....) { .... this.MergeCellSelectionRegions(selectedItemsInView .OrderBy(c => c.Column.ItemInfo.LayoutInfo.Line) .OrderBy(c => c.RowItemInfo.LayoutInfo.Line)); } } 

Kesalahan dari artikel " Memeriksa Telerik UI untuk UWP untuk berkenalan dengan PVS-Studio ". Karena penggunaan kembali dari OrderBy untuk koleksi yang sudah diurutkan, hasil dari pengurutan sebelumnya akan hilang. Anda harus menggunakan ThenBy :

 this.MergeCellSelectionRegions(selectedItemsInView .OrderBy(c => c.Column.ItemInfo.LayoutInfo.Line) .ThenBy(c => c.RowItemInfo.LayoutInfo.Line)); 

Kesalahan seperti itu dilakukan melalui kecerobohan atau ketidaktahuan. Saya pikir copy-paste yang harus disalahkan.

Tempat keenam: "Kode ini didokumentasikan," kata mereka


V3009 Aneh bahwa metode ini selalu mengembalikan satu dan nilai yang sama dari 'benar'. MaskedTextProvider.cs 1529

 public bool Remove(out int testPosition, out MaskedTextResultHint resultHint) { .... if (lastAssignedPos == INVALID_INDEX) { .... return true; // nothing to remove. } .... return true; } 

Kesalahan dari artikel " Memverifikasi kode sumber perpustakaan .NET Core dengan analisa statis PVS-Studio ". Metode ini akan selalu mengembalikan true . Ya, ini adalah kesalahan, tetapi ada sesuatu yang aneh. Komentar terperinci terlampir pada metode:

Menghapus karakter terakhir dari string yang diformat. (Hapus karakter terakhir dalam string virtual). Saat keluar, param keluar berisi posisi di mana operasi sebenarnya dilakukan. Posisi ini relatif terhadap string uji. Parameter MaskedTextResultHint out memberikan informasi lebih lanjut tentang hasil operasi. Mengembalikan nilai true pada kesuksesan, false sebaliknya.

Fokus pada kalimat terakhir. Tetapi siapa yang pernah membaca komentar ini? Tapi serius, kesalahan seperti itu dengan mudah muncul, misalnya, saat refactoring atau debugging. Kami ingin memeriksa opsi ketika hasil dari metode akan selalu benar , yah, kami lupa mengembalikan semuanya seperti sebelumnya.

Tempat kelima: "Segera siapkan aku!"


V3102 Akses mencurigakan ke elemen objek 'seq' dengan indeks konstan di dalam satu loop. XmlQueryRuntime.cs 738

 public bool MatchesXmlType(IList<XPathItem> seq, ....) { .... for (int i = 0; i < seq.Count; i++) { if (!CreateXmlType(seq[0]).IsSubtypeOf(....)) return false; } return true; } 

Kesalahan dari artikel " Memverifikasi kode sumber perpustakaan .NET Core dengan analisa statis PVS-Studio ". Ketika melintasi koleksi seq , for loop keliru menggunakan akses hanya ke elemen pertama di semua iterasi (indeks 0 bukan i ).

Tempat keempat: "Hanya satu dolar dan tidak cukup"


V3138 String literal berisi ekspresi potensial yang diinterpolasi. Pertimbangkan untuk memeriksa: e. SSPIHandleCache.cs 42

 internal static void CacheCredential(SafeFreeCredentials newHandle) { try { .... } catch (Exception e) { if (!ExceptionCheck.IsFatal(e)) { NetEventSource.Fail(null, "Attempted to throw: {e}"); } } } 

Kesalahan dari artikel " Memverifikasi kode sumber perpustakaan .NET Core dengan analisa statis PVS-Studio ". String "Mencoba melempar: {e}" tampaknya diinterpolasi. Karena karakter $ yang hilang, representasi string dari pengecualian e tidak akan diganti ke dalam string. Akibatnya, string akan digunakan "apa adanya".

Tempat ketiga: "Tidak ada jalan keluar"


V3008 [CWE-563] Variabel 'this.linker.s3.region' diberi nilai dua kali berturut-turut. Mungkin ini sebuah kesalahan. Periksa baris: 116, 114. AWSSDK.DynamoDBv2.Net45 S3Link.cs 116

 public string Region { get { .... } set { if (String.IsNullOrEmpty(value)) { this.linker.s3.region = "us-east-1"; } this.linker.s3.region = value; } } 

Kesalahan dari artikel " Mencari kesalahan dalam kode sumber SDK Amazon Web Services untuk .NET ." Di badan blok if , return dilewati. Akibatnya, variabel this.linker.s3.region akan selalu mendapatkan nilai , termasuk string kosong dan nol .

Tempat kedua: "Menjadi teratur!"


V3070 Variabel tidak diinisialisasi 'LANG_USER_DEFAULT' digunakan ketika menginisialisasi variabel 'LOCALE_USER_DEFAULT'. NativeMethods.cs 890

 internal static class NativeMethods { .... public static readonly int LOCALE_USER_DEFAULT = MAKELCID(LANG_USER_DEFAULT); public static readonly int LANG_USER_DEFAULT = MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT); .... } 

Kesalahan dari artikel " WinForms: Errors, Holmes ". Urutan inisialisasi bidang kelas dicampur. Untuk menghitung nilai bidang LOCALE_USER_DEFAULT , gunakan bidang LANG_USER_DEFAULT , yang belum diinisialisasi dan memiliki nilai 0. Variabel LANG_USER_DEFAULT tidak digunakan di tempat lain dalam kode. Untuk memahami apa yang menyebabkan kesalahan ini, sebuah program pengujian ditulis berisi metode dari kode WinForms. Untuk kesederhanaan, beberapa konstanta aktual diganti dengan nilai aktualnya:

 internal static class NativeMethods { public static readonly int LOCALE_USER_DEFAULT = MAKELCID(LANG_USER_DEFAULT); public static readonly int LANG_USER_DEFAULT = MAKELANGID(0x00, 0x01); public static int MAKELANGID(int primary, int sub) { return ((((ushort)(sub)) << 10) | (ushort)(primary)); } public static int MAKELCID(int lgid) { return MAKELCID(lgid, 0x0); } public static int MAKELCID(int lgid, int sort) { return ((0xFFFF & lgid) | (((0x000f) & sort) << 16)); } } class Program { static void Main() { System.Console.WriteLine(NativeMethods.LOCALE_USER_DEFAULT); } } 

Sebagai hasil dari peluncuran, berikut ini akan ditampilkan pada konsol: 0. Sekarang kita akan memperbaiki kesalahan dengan menukar pernyataan bidang LOCALE_USER_DEFAULT dan LANG_USER_DEFAULT . Hasil program dalam bentuk ini: 1024.

Tempat pertama: "Percaya, tapi verifikasi"


Dengan tempat pertama selalu sulit. Pasti ada sesuatu yang luar biasa dan sangat menarik. Awalnya, saya memilih lebih dari dua puluh kesalahan menarik untuk artikel ini, tetapi tidak ada yang layak dari tempat pertama di antara mereka. Dan kemudian saya teringat sebuah artikel oleh rekan saya Sergey Vasiliev, yang didedikasikan untuk satu kesalahan tunggal. Keindahan kesalahan ini adalah bahwa hal itu secara langsung mempengaruhi operasi penganalisa kami. Bagaimana? Ini sudah jelas dari judul artikel " Sejarah bagaimana PVS-Studio menemukan kesalahan di perpustakaan yang digunakan di ... PVS-Studio ". Sekali lagi, kemalasan belum dibatalkan. :) Dan di sini saya benar-benar malu dan tidak akan memberikan deskripsi kesalahan, tetapi akan mengusulkan untuk mengikuti tautan ke artikel dan mencari tahu lebih lanjut. Saya jamin - itu sangat berharga. Dan artikelnya pendek.

Kesimpulan


Saya harap kesalahannya menarik, tetapi artikel itu tidak melelahkan. Saya mengingatkan Anda bahwa Anda selalu dapat mengunduh penganalisa PVS-Studio untuk mencari kesalahan dalam proyek Anda sendiri dan pihak ketiga, untuk menyenangkan diri sendiri, teman dan kolega. Dan biarlah ada lebih sedikit kesalahan, dan lebih banyak waktu untuk perbaikan diri! :)

Sudahkah Anda membaca? Selamat telah pindah ke level selanjutnya! Dalam artikel blog kami berikut ini, bug terbaik tahun 2019 di proyek Java dan C ++ disorot .

Gambar 2




Jika Anda ingin berbagi artikel ini dengan audiens yang berbahasa Inggris, silakan gunakan tautan ke terjemahan: Sergey Khrenov. 10 Bug Top Ditemukan di Proyek C # pada tahun 2019 .

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


All Articles