Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
| Свойство | Значение |
|---|---|
| Идентификатор правила | CA2014 |
| Заголовок | не используйте stackalloc в циклах |
| Категория | Надежность |
| Исправление является критическим или не критическим | неразрывный |
| Включен по умолчанию в .NET 10 | Как предупреждение |
| Применимые языки | C# |
Причина
Использование выражения stackalloc в цикле на C#.
Описание правила
Выражение C# stackalloc выделяет память из текущего кадра стека, и эта память может не освободиться до тех пор, пока текущий вызов метода не завершится. Если stackalloc используется в цикле, это может привести к переполнению стека из-за исчерпания памяти стека.
Устранение нарушений
Переместите выражение stackalloc за пределы всех циклов метода.
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;
// ...
}
}
Когда лучше отключить предупреждения
Можно безопасно отключить предупреждение, если один или несколько содержащихся циклов вызываются только ограниченное число раз, при условии, что общий объем памяти, выделяемой на все операции stackalloc, считается относительно небольшим.
Отключение предупреждений
Если вы просто хотите отключить одно нарушение, добавьте директивы препроцессора в исходный файл, чтобы отключить и повторно включить правило.
#pragma warning disable CA2014
// The code that's violating the rule is on this line.
#pragma warning restore CA2014
Чтобы отключить правило для файла, папки или проекта, задайте его серьезность none в файле конфигурации.
[*.{cs,vb}]
dotnet_diagnostic.CA2014.severity = none
Чтобы отключить эту всю категорию правил, задайте уровень серьезности для категории none в файле конфигурации.
[*.{cs,vb}]
dotnet_analyzer_diagnostic.category-Reliability.severity = none
Дополнительные сведения см. в разделе Практическое руководство. Скрытие предупреждений анализа кода.