1

次の VB.net コードを変更すると、奇妙な動作が見られます。これは元のソースコードです:

Private Function ValidateSelectedId(ByVal purposeId As String) As Boolean
    Dim possiblePurposes As New InfoCollector.Purpose
    Dim isPurposeValid As Boolean = False

    'Any of the following purposes (but only these)
    'should be considered valid
    Select Case UCase(purposeId)
        Case UCase(possiblePurposes.FirstPurpose), _
             UCase(possiblePurposes.SecondPurpose), _
             UCase(possiblePurposes.ThirdPurpose), _
             UCase(possiblePurposes.FourthPurpose)

                isPurposeValid = True
            Case Else
                isPurposeValid = False
        End Select

        Return isPurposeValid
End Function

これが新しいバージョンです。唯一の変更点は、5 番目の有効な目的の追加です。

Private Function ValidateSelectedId(ByVal purposeId As String) As Boolean
    Dim possiblePurposes As New InfoCollector.Purpose
    Dim isPurposeValid As Boolean = False

        Select Case UCase(purposeId)
            Case UCase(possiblePurposes.FirstPurpose), _
             UCase(possiblePurposes.SecondPurpose), _
             UCase(possiblePurposes.ThirdPurpose), _
             UCase(possiblePurposes.FourthPurpose), _
             UCase(possiblePurposes.FifthPurpose) 

                isPurposeValid = True
            Case Else
                isPurposeValid = False
        End Select

        Return isPurposeValid
End Function

この新しいバージョンをローカル PC でコンパイルして機能をテストしたところ、問題なく動作しました。これを中央コード リポジトリにチェックインし、サーバー上でビルドした後、使用に失敗しました (新しい目的を無視しているように見えました)。不足しているものを見つけようとしているときに、サーバーで見つかった .DLL を逆コンパイルしました。これが私に与えられたものです (注: 変数名を変更し、わずかに再フォーマットしました):

Private Function ValidateSelectedId(ByVal purposeId As String) As Boolean 
    Dim ValidateSelectedId As Boolean
    Dim possiblePurposes As Purpose = New Purpose()
    Dim isPurposeValid As Boolean = False
    Dim str As String = Strings.UCase(purposeId)

    If (Operators.CompareString(str, Strings.UCase(possiblePurposes.FirstPurpose), False) <> 0) Then
        If (Operators.CompareString(str, Strings.UCase(possiblePurposes.SecondPurpose), False) <> 0 
            AndAlso (Operators.CompareString(str, Strings.UCase(possiblePurposes.ThirdPurpose), False) = 0 
            OrElse Operators.CompareString(str, Strings.UCase(possiblePurposes.FourthPurpose), False) <> 0)) Then

                If (Operators.CompareString(str, Strings.UCase(possiblePurposes.FifthPurpose), False) = 0) Then
                    Return True
                End If

                isPurposeValid = False
        End If
    End If

    Return isPurposeValid
End Function

また、これを C# に逆コンパイルしてみました。

private bool ValidateSelectedId(string purposeId)
{
    bool ValidateSelectedId;
    Purpose possiblePurposes = new Purpose();
    bool isPurposeValid = false;
    string str = Strings.UCase(purposeId);

    if (Operators.CompareString(str, Strings.UCase(possiblePurposes.FirstPurpose), false) != 0)
    {
        if (Operators.CompareString(str, Strings.UCase(possiblePurposes.SecondPurpose), false) != 0 
            && (Operators.CompareString(str, Strings.UCase(possiblePurposes.ThirdPurpose), false) == 0 
            || Operators.CompareString(str, Strings.UCase(possiblePurposes.FourthPurpose), false) != 0))
        {
            if (Operators.CompareString(str, Strings.UCase(possiblePurposes.FifthPurpose), false) == 0)
            {
                return true;
            }
            isPurposeValid = false;
        }
    }
    return isPurposeValid;
}

ただし、これは私が望んでいたことの逆のようなことをしているようで、元のソースコードが言っていることとはまったく異なります!

元のソース コードがどのようにコンパイルされたのかわかりません。逆コンパイラに問題があるのでしょうか (Telerik の Just Decompile を使用しています)。もしそうなら、ロジックはローカル PC では機能するのに、サーバーでは機能しないのはなぜですか?

コンパイルプロセスに実際に何らかのバグがある可能性はありますか? それとも、私は完全な Id**t であり、逆コンパイルされたコードのロジックを単に誤解しているのでしょうか?

これを説明するための関連する理論は大歓迎です。

4

1 に答える 1

3

愚かな私。
最終的に、これがサーバーで機能しない理由を発見しました。別の関連するバグがあり、ローカルでは修正されていましたが、サーバーでは修正されていませんでした。

愚かな逆コンパイラ。
私は逆コンパイラの結果に戸惑いましたが、明らかにめちゃくちゃでした。私はこれまで何度も JustDecompile を使用してきましたが、このような問題に遭遇したことはありません。どうやら、上記の方法からコードを適切な方法で逆コンパイルすることはできません。

私の推測では、コンパイル中に何らかの最適化が行われるため、JustDecompile を正しく理解して表示するのは困難です。

変更がサーバーに公開されたことを確認したかっただけです。代わりに、私は幻の虫の野生のガチョウ追跡に送られました. 得られた教訓: 必要に応じて逆コンパイラを使用しますが、それが示すすべてを自動的に信頼しないでください。

于 2012-09-04T13:18:04.037 に答える