Megosztás a következőn keresztül:


CA2014: Ne használjon stackallocot hurkokban

Tulajdonság Érték
Szabályazonosító CA2014
Cím Ne használjon stackallocot hurkokban
Kategória Megbízhatóság
A javítás kompatibilitástörő vagy nem törik Nem törés
Alapértelmezés szerint engedélyezve a .NET 10-ben Figyelmeztetésként

Ok

A C# stackalloc kifejezés használata egy cikluson belül.

Szabály leírása

A C# stackalloc -kifejezés lefoglalja a memóriát az aktuális veremkeretből, és előfordulhat, hogy a memória nem szabadul fel, amíg az aktuális metódushívás vissza nem tér. Ha stackalloc hurokban használják, az a veremmemória kimerítése miatt túlcsordulásokhoz vezethet.

Szabálysértések kijavítása

A kifejezés áthelyezése a stackalloc metódus összes ciklusán kívülre.

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;

        // ...
    }
}

Mikor kell letiltani a figyelmeztetéseket?

Biztonságos lehet a figyelmeztetés mellőzése, ha a ciklusokat vagy hurkokat csak véges számú alkalommal hívja meg a rendszer, így az összes stackalloc művelethez lefoglalt memória teljes mennyisége viszonylag kicsi.

Figyelmeztetés mellőzése

Ha csak egyetlen szabálysértést szeretne letiltani, adjon hozzá előfeldolgozási irányelveket a forrásfájlhoz a szabály letiltásához és újbóli engedélyezéséhez.

#pragma warning disable CA2014
// The code that's violating the rule is on this line.
#pragma warning restore CA2014

Ha le szeretné tiltani egy fájl, mappa vagy projekt szabályát, állítsa annak súlyosságát none a konfigurációs fájlban.

[*.{cs,vb}]
dotnet_diagnostic.CA2014.severity = none

A teljes szabálykategória letiltásához állítsa be a kategória súlyosságát none a konfigurációs fájlban.

[*.{cs,vb}]
dotnet_analyzer_diagnostic.category-Reliability.severity = none

További információ: Kódelemzési figyelmeztetések letiltása.

Lásd még