4

ReSharperにバグを見つけたと思います。次のようなコードがあるとします。

int[] someArray = new int[10];
while (someArray  != null)
{
     //perhaps some other usage of someArray here, but not assigning it.
     SomeMethod(ref someArray );
}

ローカル変数someArrayがそのスコープでnullに割り当てられていない場合、ステートメントsomeArray != nullは常にtrueになります。ただし、その変数が別のメソッドのrefパラメーターとして指定されている場合は、そのメソッドでnullに割り当てられる可能性があるため、そうではありません。someArray != null次に、ReSharperは、それが常に真であると誤って想定します。

これで何をすべきかわからないので、この情報を共有したいと思いました。まず、誰かにこのバグを確認してもらい、その後、JetBrainsに送信してもらいたいですか?

4

2 に答える 2

11

うーん、どうやらReSharperの静的分析は私より賢いです...「式は常に真です」という警告を正しく受け取るコードは次のとおりです。

int[] someArray = new int[10];
while (someArray != null)
{
    Foo(ref someArray);
    someArray.Bar();
}

冗長な警告が表示されるので、実際にはnullに割り当てることができるsomeArray != nullため、ReSharperがrefパラメーターを誤って解釈したと思いました。someArrayしかし、それが警告が正しい理由ではありません。次に、微妙な事実が役割を果たします。つまり、someArraynullは、のメソッド呼び出しがBarをスローすることを意味し、NullReferenceExceptionそれによって、whileループの開始に到達しないように制御フローを変更します。したがってsomeArray、Fooでがnullに割り当てられている場合でも、警告は正しいです。

私の間違い、そしてあなたの努力に感謝します。

于 2011-04-06T16:06:07.837 に答える
1

このループをdo-whileに変更して、この状況でReSharperがマークするものを確認してください。それはまだ常に真実ですか?しかし、最初のループでは、それは実際には「常に真」であるため、ReSharperはそれを正しく評価します(静的分析です)。

于 2011-04-06T07:13:03.663 に答える