[C#] 예외를 던질 때 (false == true) 블록을 실행하면

다소 이상한 문제가 발생했습니다.

이것은 내 코드입니다.

private async Task BreakExpectedLogic()
{
    bool test = false;
    if (test == true)
    {
        Console.WriteLine("Hello!");
        throw new Exception("BAD HASH!");
    }
}

정말 간단 해 보이므로 Console.WriteLine또는에 맞지 않아야 합니다 throw. 어떤 이유로 든 항상 throw.

내가 throw자신의 방법으로 옮기면 정상적으로 작동합니다. 내 질문은 어떻게 if블록을 무시 하고 throw new Exception:

여기 몇 가지 증거가 있습니다

편집 1 : 서명을 포함하도록 코드를 업데이트했지만이 문제와 관련이없는 모든 것을 제거하고 실행했지만 여전히 발생합니다.



답변

async메서드 의 버그 인 것 같습니다 . 코드 실제로 실행되지 않지만 디버거는 throw문 이있는 줄로 이동 합니다. 이 줄 throw안에 문장 앞에 몇 줄의 코드가있는 경우 if디버거 는 with with 줄 로만 이동합니다 throw.

– 또한, 변수를 사용하지 않는 경우 if (false)또는 if (true == false)다음 코드의 올바른 라인 단계 디버거 – 닫는 중괄호합니다.

이 버그는 @Matthew Watson 이 Visual Studio 팀 에 게시했습니다 (현재 링크를 사용할 수 없음).

또한 비슷한 질문을 참조하십시오- 비동기 방법의 조건 확인

편집 (2017/10/06) :

.Net Framework 4.7을 사용하여 VS 2017 15.3.5에서 문제를 재현 할 수 없습니다. VS 팀 이이 문제를 해결 한 것 같습니다.


답변

대답에 대한 부록, 최근에 같은 문제가 발생하여 디버거에서 실제 x86 코드를 보았으며 다음과 같이 이상한 방식으로 생성되었습니다 (단순화).

// if (...) {
0001: jne 0006
...
0006: jmp 0007
// }
0007: ret

따라서 메소드의 마지막 명령어로 직접 점프하는 대신 이중 점프를 수행합니다. 여기서 두 번째 무조건 점프는 if블록 내부의 코드의 일부로 잘못 인식됩니다 .

따라서이 버그는 JIT 컴파일러와 관련이 있다고 생각합니다.


답변