CA2014: Jangan gunakan stackalloc dalam perulangan

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.

Lihat juga