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 |
| Golongan | Keandalan |
| Perbaikan bersifat disruptif atau non-disruptif | Non-disruptif |
| Diaktifkan secara default di .NET 10 | Sebagai peringatan |
Penyebab
Menggunakan ekspresi stackalloc C# di dalam perulangan.
Deskripsi aturan
Ekspresi stackalloc C# mengalokasikan memori dari bingkai tumpukan saat ini, dan memori tersebut mungkin tidak dirilis hingga panggilan metode saat ini kembali. Jika stackalloc digunakan dalam perulangan, itu dapat menyebabkan tumpukan meluap karena kebanjiran memori tumpukan.
Cara memperbaiki pelanggaran
Pindahkan ekspresi stackalloc di luar 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.