このページは日本語には対応しておりません。随時翻訳に取り組んでいます。
翻訳に関してご質問やご意見ございましたら、お気軽にご連絡ください

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