이 코드는 C# 컴파일러의 버그처럼 보입니다.컴파일러가 런타임과 다른 MinValue % -1을 평가하는 이유는 무엇입니까?
const long dividend = long.MinValue;
const long divisor = -1L;
Console.WriteLine(dividend % divisor);
그것은 오류없이 (또는 경고)로 컴파일 :
는 (방법 내부)이 코드를 생각해 보자. 버그가있는 것 같습니다. 실행하면 콘솔에0
이 인쇄됩니다.
const
없이 그런
코드 :이 실행되면
long dividend = long.MinValue;
long divisor = -1L;
Console.WriteLine(dividend % divisor);
가 제대로 던져지는 OverflowException
발생합니다.
C# 언어 사양에는이 사례가 구체적으로 언급되어 있으며 System.OverflowException
이 던져 질 것이라고합니다. 그것은 컨텍스트 checked
또는 unchecked
에 의존하지 않습니다 (나머지 연산자에 대한 컴파일 타임 상수 피연산자가있는 버그는 checked
및 unchecked
과 동일합니다).
long
(System.Int64
)이 아닌 int
(System.Int32
)과 동일한 버그가 발생합니다.
는 비교를 위해, 컴파일러는 const
와 dividend/divisor
이 dividend % divisor
보다 훨씬 더 피연산자 처리합니다.
내 질문 :
오전 내가 바로이 버그가? 그렇다면 컴파일 타임 상수가 -1
인 % -1
을 사용하는 것이 다소 어리석은 경우에도 이전 버전과의 호환성 때문에 수정하지 않으려는 잘 알려진 버그입니까? 아니면 우리가 C# 컴파일러의 다음 버전에서 수정할 수 있도록보고해야합니까?
@EricLippert가이 질문에 대해 적절한 군중을 끌어 들일 수 있음을 말합니다. –
@Morten,이 시점에서, 그는 Coverity의 그의 농어촌에서 아주 시선을 끕니다. ;) –
나는 왜 이런 일이 일어나고 있는지 나를 괴롭히는 것처럼 현상금을 줘야한다고 생각합니다. 명세는 런타임 예외를 던질 수있는 상수 표현이 컴파일시 컴파일 타임 오류를 일으켜 야한다고 말한다. –