Почему я получаю анализ кода CA1062 на выходной параметр в этом коде? - PullRequest
6 голосов
/ 19 мая 2010

У меня есть очень простой код (упрощенный по сравнению с исходным кодом - так что я знаю, что это не очень умный код), который при компиляции в Visual Studio 2010 с Code Analysis выдает мне предупреждение CA1062: проверка аргументов открытых методов.

public class Foo
{
    protected static void Bar(out int[] x)
    {
        x = new int[1];
        for (int i = 0; i != 1; ++i)
            x[i] = 1;
    }
}

Предупреждение, которое я получаю:

CA1062: Microsoft.Design: In внешне видимый метод 'Foo.Bar (out int []) ', проверить локальную переменную '(* x)', который был переназначен из параметр 'x', перед его использованием.

Я не понимаю, почему я получаю это предупреждение и как я могу устранить его, не подавляя его? Может ли new вернуть null? Это ошибка Visual Studio 2010?

UPDATE

Я решил открыть отчет об ошибке в Microsoft Connect .

Ответы [ 2 ]

8 голосов
/ 19 мая 2010

Я воспроизвел это в Visual Studio 2010 Premium с кодом в точности так, как указано, и с Microsoft All Rules , включенным в настройках анализа.

Похоже, что это ошибка (см. Ниже: http://msdn.microsoft.com/en-us/library/ms182182.aspx). Жалуется, что вы не проверяете, что x не является нулевым, прежде чем использовать его, но он имеет параметр out нет входного значения для проверки!

5 голосов
/ 19 мая 2010

Проще показать, чем описать:

public class Program
{
    protected static int[] testIntArray;

    protected static void Bar(out int[] x)
    {
        x = new int[100];
        for (int i = 0; i != 100; ++i)
        {
            Thread.Sleep(5);
            x[i] = 1; // NullReferenceException
        }
    }

    protected static void Work()
    {
        Bar(out testIntArray);
    }

    static void Main(string[] args)
    {
        var t1 = new Thread(Work);
        t1.Start();

        while (t1.ThreadState == ThreadState.Running)
        {
            testIntArray = null;
        }
    }
}

И правильный путь:

    protected static void Bar(out int[] x)
    {
        var y = new int[100];

        for (int i = 0; i != 100; ++i)
        {
            Thread.Sleep(5);
            y[i] = 1;
        }

        x = y;
    }
...