CA2018: Buffer.BlockCopy に対する count の引数で、コピーするバイト数を指定する必要がある

プロパティ
ルール ID CA2018
Title Buffer.BlockCopy に対する引数 count で、コピーするバイト数を指定する必要があります
[カテゴリ] 信頼性
修正が中断ありか中断なしか なし
.NET 8 では既定で有効 警告として

原因

この規則は、要素のサイズが 1 バイトより大きい配列で、Array.LengthBuffer.BlockCopycount 引数で使用されるときに適用されます。

規則の説明

Buffer.BlockCopy を使用するとき、count 引数では、コピーするバイト数を指定します。 Array.Length は、その要素のサイズが正確に 1 バイトの配列上の count 要素にのみ使用します。 bytesbyte、および bool には、サイズが 1 バイトの要素があります。

違反の修正方法

count 引数に対してコピーするバイト数を指定します。

違反:

using System;
class Program
{
    static void Main()
    {
        int[] src = new int[] {1, 2, 3, 4};
        int[] dst = new int[] {0, 0, 0, 0};

        Buffer.BlockCopy(src, 0, dst, 0, src.Length);
    }
}

修正:

配列の要素のサイズが 1 バイトより大きい場合、配列の長さに要素のサイズを掛けるとバイト数が得られます。

using System;
class Program
{
    static void Main()
    {
        int[] src = new int[] {1, 2, 3, 4};
        int[] dst = new int[] {0, 0, 0, 0};

        Buffer.BlockCopy(src, 0, dst, 0, src.Length * sizeof(int));
    }
}

どのようなときに警告を抑制するか

この規則からの警告を抑制することは一般的に安全ではありません。

関連項目