2017-09-14 10 views
3

14.9.2017에 Windows 업데이트가 설치되었으므로 릴리스 빌드에서 특정 구조체를 만드는 데 문제가 있습니다. 해당 업데이트가 설치되지 않은 컴퓨터에서 컴파일 된 코드가 예상대로 실행됩니다 ("잘못된 시작 : 1.1.1990 ..."). 문제의 업데이트가 설치된 컴퓨터에서 코드가 올바르게 작동하지 않습니다 ("잘못된 시작 : 1.1. 2000 ... "). 이 문제는 버전 4.x부터 모든 .NET Framework 버전에서 발생합니다.Windows 업데이트가 .Net 4.x의 구조체를 손상시킵니다.

class Program 
    { 
     static void Main(string[] args) 
     { 
      DateTime start1 = new DateTime(1990, 1, 1, 6, 0, 0); 
      DateTime end1 = new DateTime(2000, 1, 1, 6, 0, 0); 
      var r2 = new DateTimeRange(start1, end1); 
      var r3 = new Range<DateTime>(r2.From, r2.To); 
      Console.WriteLine($"Wrong start: {r3.From}, correct start: {start1}"); 
      Console.ReadLine(); 
     } 
    } 

    public struct DateTimeRange 
    { 
     private Range<DateTime> m_range; 

     public DateTimeRange(DateTime from, DateTime to) 
     { 
      m_range = new Range<DateTime>(from, to); 
     } 


     public DateTime From 
     { 
      get { return m_range.From; } 
     } 

     public DateTime To 
     { 
      get { return m_range.To; } 
     } 
    } 

    public struct Range<T> where T : struct 
    { 
     private T m_from; 
     private T m_to; 


     public Range(T from, T to) 
     { 
      m_from = from; 
      m_to = to; 
     } 


     public T From 
     { 
      get { return m_from; } 
     } 

     public T To 
     { 
      get { return m_to; } 
     } 
    } 
+0

"잘못됨"을 정의하십시오. 증상/오류가 무엇입니까? – DiskJunky

+0

해당 날짜에 설치된 Windows 업데이트는 무엇입니까? – AKX

+0

프로젝트에서 bin 폴더를 삭제하고 다시 컴파일하십시오. 새 Bin 폴더가 생성됩니다. 컴파일러는 Framework에 대한 종속성을 인식하지 않으므로 컴파일러는 모든 객체를 자동으로 업데이트하지 않습니다. 따라서 저장소를 삭제하면 컴파일러가 프로젝트를 완전히 다시 컴파일해야합니다. – jdweng

답변

3

내 컴퓨터를 재부팅 한 후에 확인합니다. 확실히 업데이트에서 버그처럼 qu. 거리는 소리. 내 컴퓨터에서 C : \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ corjit.dll (9/6/17, 9:23 AM CDT, 버전 4.7.2110.0) 참조.

이 버그는 x64 지터에만 해당되며 최적화 프로그램이 활성화 된 릴리즈 빌드에서만 발생합니다. 전에 지터에서 본 버그의 종류와 일치합니다. 과거의 대부분의 최적화 프로그램 버그는 코드 처리 구조체와 관련이있었습니다.

불행히도 버그를 특징 짓는 데 어려움을 겪었습니다. 코드 gen은 너무 비싸고 발견 된 해결 방법은 처음에는 기계 코드에 충분한 차이가없는 것처럼 보입니다.

using System.Runtime.CompilerServices; 
... 
    public DateTime From { 
     [MethodImpl(MethodImplOptions.NoInlining)] 
     get { return m_range.From; } 
    } 

다른 해결 방법은 32 비트 모드를 강제 또는 the legacy jitter 다시 떨어지고있다 :하지만, 그렇지 않으면 최적화 버그 이런 종류의 주위에 항해하는 일반적인 방법입니다. 제발 그들은 고칠 수있는 report the bug하시기 바랍니다, 당신이 시간을 내고 싶지 않다면 알려주십시오 그리고 내가 돌볼 것입니다.

+1

제안과 도움에 감사드립니다. 문제를 신고했습니다. 언급 된 공물은 효과가 있지만 일반적으로 해결 될 수 있기를 바랍니다. –

+1

https://github.com/dotnet/coreclr/issues/14007 –