이 페이지는 아직 영어로 제공되지 않습니다. 번역 작업 중입니다.
현재 번역 프로젝트에 대한 질문이나 피드백이 있으신 경우 언제든지 연락주시기 바랍니다.

Metadata

ID: csharp-best-practices/stackallow-loops

Language: C#

Severity: Warning

Category: Performance

Description

The rule “Do not use stackalloc in loops” is crucial to maintain efficient memory usage in your C# applications. stackalloc is a keyword in C# that allows you to allocate a block of memory on the stack, which is a limited resource. When used inside a loop, stackalloc may cause a rapid increase in memory usage that could lead to a StackOverflowException, especially if the loop iteration count is high or unpredictable.

It is important to remember that stack space is limited, and overuse can lead to stack overflow errors, which are generally hard to recover from. The memory allocated by stackalloc is automatically freed when the method that contains the stackalloc expression returns, but in a loop, the memory allocated in each iteration will not be freed until the method returns, which could be much later.

How to Remediate

Use stackalloc outside loops, preferably in a method scope where the allocated memory size is clearly defined and limited. You can clear or reset the buffer after each iteration if needed. This practice ensures that the stackalloc memory is efficiently managed and prevents potential stack overflow issues.

Non-Compliant Code Examples

using System;

class Program
{
    static void Main()
    {
        for (int i = 0; i < 10; i++)
        {
            Span<int> buffer = stackalloc int[10];
            buffer[0] = i;
            Console.WriteLine(buffer[0]);
        }
    }
}

Compliant Code Examples

using System;

class Program
{
    static void Main()
    {
        Span<int> buffer = stackalloc int[10]; // stackalloc used only once, outside the loop

        for (int i = 0; i < 10; i++)
        {
            buffer.Clear(); // Optional: reset buffer contents
            buffer[0] = i;
            Console.WriteLine(buffer[0]);
        }
    }
}
https://static.datadoghq.com/static/images/logos/github_avatar.svg https://static.datadoghq.com/static/images/logos/vscode_avatar.svg jetbrains

Seamless integrations. Try Datadog Code Security

PREVIEWING: aleksandr.pasechnik/svls-6807-lambda-fips