Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
| 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.