Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
| Properti | Nilai |
|---|---|
| ID Aturan | CA2014 |
| Judul | Jangan gunakan stackalloc dalam perulangan |
| Kategori | Keandalan |
| Perbaikan bersifat merusak atau tidak merusak | Tidak terputus |
| Diaktifkan secara default di .NET 10 | Sebagai peringatan |
| Bahasa yang berlaku | C# |
Penyebab
Menggunakan ekspresi stackalloc C# di dalam perulangan.
Deskripsi aturan
Ekspresi stackalloc C# mengalokasikan memori dari frame tumpukan saat ini, dan memori tersebut mungkin tidak dilepaskan hingga panggilan metode saat ini selesai. Jika stackalloc digunakan dalam perulangan, hal ini dapat menyebabkan stack overflow karena kehabisan memori tumpukan.
Cara memperbaiki pelanggaran
Pindahkan ekspresi stackalloc keluar dari semua perulangan dalam metode.
Example
// This method violates the rule.
public void ProcessDataBad()
{
for (int i = 0; i < 100; i++)
{
// CA2014: Potential stack overflow.
// Move the stackalloc out of the loop.
Span<int> buffer = stackalloc int[100];
buffer[0] = i;
// ...
}
}
// This method satisfies the rule.
public void ProcessDataGood()
{
Span<int> buffer = stackalloc int[100];
for (int i = 0; i < 100; i++)
{
buffer[0] = i;
// ...
}
}
Kapan harus menekan peringatan
Mungkin aman untuk menyembunyikan peringatan ketika satu atau beberapa perulangan yang berisi hanya dipanggil dalam jumlah waktu terbatas, sehingga jumlah memori keseluruhan yang dialokasikan di semua operasi stackalloc diketahui relatif kecil.
Menyembunyikan peringatan
Jika Anda hanya ingin menyembunyikan satu pelanggaran, tambahkan arahan praprosedur ke file sumber Anda untuk dinonaktifkan lalu aktifkan kembali aturannya.
#pragma warning disable CA2014
// The code that's violating the rule is on this line.
#pragma warning restore CA2014
Untuk menonaktifkan aturan untuk file, folder, atau proyek, atur tingkat keparahannya ke none dalam file konfigurasi.
[*.{cs,vb}]
dotnet_diagnostic.CA2014.severity = none
Untuk menonaktifkan seluruh kategori aturan ini, atur tingkat keparahan untuk kategori ke none dalam file konfigurasi.
[*.{cs,vb}]
dotnet_analyzer_diagnostic.category-Reliability.severity = none
Untuk informasi selengkapnya, lihat Cara menyembunyikan peringatan analisis kode.