Pourquoi dois-je obtenir l'analyse du code CA1062 sur un paramètre dans ce code?
-
30-09-2019 - |
Question
J'ai un code très simple (simplifié du code original - donc je sais que ce n'est pas un code très intelligent) que lorsque je compile dans Visual Studio 2010 avec l'analyse du code me donne CA1062 avertissement: Valider les arguments des méthodes publiques
public class Foo
{
protected static void Bar(out int[] x)
{
x = new int[1];
for (int i = 0; i != 1; ++i)
x[i] = 1;
}
}
L'avertissement que je reçois:
CA1062: Microsoft.Design: Dans Procédé extérieurement visible « Foo.Bar (out int []) », valider la variable locale '(X *)', qui a été réaffecté de paramètre 'x', avant de l'utiliser.
Je ne comprends pas pourquoi je reçois cet avertissement et comment puis-je résoudre sans le supprimer? Peut new
null
de retour? Est-ce un bug Visual Studio 2010?
UPDATE
J'ai décidé d'ouvrir un rapport de bogue sur Microsoft Connect .
La solution
Je l'ai reproduit dans Visual Studio 2010 Premium le code exactement comme donné et avec Microsoft Toutes les règles activé dans les paramètres d'analyse.
Il ressemble à ceci est un bug (voir en bas de ici: http: / /msdn.microsoft.com/en-us/library/ms182182.aspx ). Il est complainng que vous ne vérifiez pas que x
est pas nul avant de l'utiliser, mais il est le paramètre out
donc il n'y a pas de valeur d'entrée pour vérifier!
Autres conseils
Il est plus facile de montrer que de décrire:
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;
}
}
}
Et la manière correcte est:
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;
}