Microsoft로 로그인
로그인하거나 계정을 만듭니다.
안녕하세요.
다른 계정을 선택합니다.
계정이 여러 개 있음
로그인할 계정을 선택합니다.

Microsoft Visual Studio 2015 업데이트 3에 대 한 핫픽스 패키지를 설명합니다. 핫픽스 Visual C++ 최적화와 코드 생성기 (c2.dll)에 몇 가지 수정 프로그램도 포함 되어 있습니다. 자세한 내용은 "문제는이 핫픽스 해결" 절을 참조 하십시오.

해결 방법

이 핫픽스를 구하는 방법

다음 파일은 Microsoft 다운로드 센터에서 다운로드할 수 있습니다.

Download 핫픽스 패키지를 지금 다운로드 하십시오.

Microsoft 지원 파일을 다운로드하는 방법에 대한 자세한 내용을 보려면 Microsoft 기술 자료의 다음 문서 번호를 클릭합니다.

119591 온라인 서비스 로부터 Microsoft 지원 파일을 구하는 방법Microsoft는 이 파일에 대해 바이러스 검사를 시행하였습니다. Microsoft는 파일이 게시된 날짜에 사용할 수 있었던 최신 바이러스 검색 소프트웨어를 사용했습니다. 파일은 파일을 무단으로 변경할 수 없도록 보안이 강화된 서버에 저장됩니다.

전제 조건

이 핫픽스를 적용 하려면 Visual Studio 2015 업데이트 3 설치 되어 있어야 합니다.

다시 시작 요구 사항

Visual Studio 인스턴스가 사용 중인 경우이 핫픽스를 적용 한 후 컴퓨터를 다시 시작 해야 할 수 있습니다.

핫픽스 대체 정보

이 핫픽스는 다른 핫픽스를 대체 하지 않습니다.

이 핫픽스에서 해결 된 문제

이 핫픽스는 다음 문제에 대 한 수정 프로그램이 포함 되어 있습니다.

  • 루프 밖의 변형 루프 조건부 저장소 호이스팅 때 최적화 프로그램에서 버그를 해결 합니다. #include <cstdlib> #include <cassert> struct Foo { int a; int b; }; int main() { Foo foo; foo.b = rand(); int a = rand(); int b = foo.b; for (int i = 0; i < 10; ++i) { int inner_b = b; int inner_a = a; if (inner_b < 0) // This gets incorrect hoisted outside the loop. // A workaround is /d2SSAOptimizer- { inner_a = 0; inner_b = 0; } if (inner_b >= 0) assert(inner_a == a); a += b; } return 0; }

     

  • 최적화 프로그램에서 정수 나누기 버그 수정: #include <stdio.h> volatile int z = 0; int main() { unsigned a, b; __int64 c; a = z; c = a; c = (c == 0) ? 1LL : c; b = (unsigned)((__int64)a * 100 / c); // Division was made unconditional // incorrectly creating a divide by zero. // A workaround is /d2SSAOptimizer- printf("%u\n", b); return 0; }

     

  • 최적화 프로그램에서 정수 나누기 버그 수정: int checkchecksum(int suly, int ell, int utkodert) { int x; ell -= utkodert; ell %= 103; if (suly - 1) utkodert /= (suly - 1); // Division was made unconditional, // incorrectly creating a potential divide by zero // A workaround is /d2SSAOptimizer- return utkodert; }

     

  • 최적화 프로그램에서 정수 나누기 버그 수정: typedef int unsigned uint; volatile uint out_index = 0; bool data[1] = {true}; bool __declspec(noinline) BugSSA(uint index) { uint group = index / 3; if (group == 0) // The division result being compared to zero is replaced // with a range check. We then incorrectly move the division { // to the next use of "group", without accounting for the fact // that "index" has changed. A workaround is /d2SSAOptimizer- return false; } index -= 3; group--; bool ret = data[group]; // crash here out_index = index; out_index = index; return ret; } int main() { volatile uint i = 3; return BugSSA(i); }

     

  • MIN_INT-1에 의해 분할에 대 한 최적화 프로그램에서 충돌을 수정 하십시오. int test_div(bool flag, int dummy) { int result = std::numeric_limits<int>::min(); int other; if (flag) other = -1; else other = dummy - 1 - dummy; result /= other; // We would push the division up into both arms of the // if-then-else. One of those divisions would cause the // optimizer to evaluate MIN_INT/-1.This is a crash, similar // to dividing by zero. A workaround is /d2SSAOptimizer- return result; }

     

  • 최적화 프로그램에서 스택 오버플로 해결합니다. #include <stdio.h> // This example produced a stack overflow in the optimizer, which was // caused by mutually-recursive analysis functions not properly tracking // the number of times they were invocated. // A workaround is /d2SSAOptimizer- typedef unsigned char byte; typedef unsigned long long int uint64; int main() { const uint64 *sieveData = new uint64[1024]; uint64 bitIndexShift = 0; uint64 curSieveChunk = 0xfafd7bbef7ffffffULL & ~uint64(3); const unsigned int *NumbersCoprimeToModulo = new unsigned int[16]; const unsigned int *PossiblePrimesForModuloPtr = NumbersCoprimeToModulo; while (!curSieveChunk) { curSieveChunk = *(sieveData++); const uint64 NewValues = (16 << 8) | (32 << 24); bitIndexShift = (NewValues >> (bitIndexShift + 8)) & 255; PossiblePrimesForModuloPtr = NumbersCoprimeToModulo + bitIndexShift; } if (PossiblePrimesForModuloPtr - NumbersCoprimeToModulo != 0) { printf("fail"); return 1; } printf("pass"); return 0; }

     

  • 제거 중복 부동 소수점 변환 관련으로 int32 매개 변수 f64를 변환 하는 잘못 된 코드 생성을 수정 하십시오. #include <string> __declspec(noinline) void test(int Val) { double Val2 = Val; std::string Str; printf("%lld\n", __int64(Val2)); // We incorrectly try to read 64 bits of // floating point from the parameter area, // instead of reading 32 bits of integer // and converting it. A workaround is // to throw /d2SSAOptimizer- } int main() { test(6); test(7); return 0; }

     

  • 분할 흐름 그래프 노드 기본 문의 자세한 내용은 스위치 블록, https://bugs.chromium.org/p/chromium/issues/detail?id=627216#c15을 참조 하면 최적화 프로그램에서 충돌을 해결 합니다.

  • 이행에 배수가 주 유도 변수의 부호 없는 보조 유도 변수의 잘못 된 강도 감소를 수행 루프 최적화 프로그램에서 버그를 해결 합니다. #include <assert.h> #include <malloc.h> #include <stdio.h> typedef unsigned int uint; typedef unsigned char byte; /* There is a corner case in the compiler's loop optimizer. The corner case arose if an induction variable (IV) is a multiple of the loop index, and there's a comparison of the IV to an integer that is less than this multiplication factor. A workaround is to use #pragma optimize("", off) / #pragma optimize("", on) around the affected function. */ int main(int argc, char *argv[]) { const uint w = 256; const uint h = 64; const uint w_new = w >> 1; const uint h_new = h >> 1; const byte *const src = (byte *)malloc(w * h); byte *it_out = (byte *)malloc(w_new * h_new); int fail = 0; for (uint y_new = 0; y_new < h_new; ++y_new) { for (uint x_new = 0; x_new < w_new; ++x_new, ++it_out) { uint x = x_new * 2; uint y = y_new * 2; if (x < 1 || y < 1) { *it_out = 0; continue; } if (x != 0) { } else { fail = 1; } *it_out = 4 * src[y * w + x]; } } if (fail) { printf("fail\n"); return (1); } printf("pass\n"); return (0); }

     

  • C4883에 대 한 해결 방법을 제공 ": 함수 크기 최적화를 표시 하지 않습니다". 함수를 거 대 한을 인식 하는 최적화 프로그램 확장 됩니다 다시 최적화를 수행 합니다. 발급 될 C4883 경고를이 작업을 수행 하는 경우 /we4883을 통해 경고를 사용 하는 경우. 최적화는이 결정을 무시 하려는 경우 /d2OptimizeHugeFunctions 스위치를 throw 합니다.

  • C 2에는 컴파일러 크래시를 수정! PpCanPropagateForward x64에서 최적화를 수행 하면 됩니다.

  • 잘못 된 유도 가변 강도 감소를 포함 하는 루프 최적화 프로그램 버그를 해결 합니다.

  • 잘못 된 읽기를 포함 하는 식의 순서를 변경 하는 것에 대 한 해결 및 잘못 된 별칭 검사로 인해 메모리에 씁니다.

  • 컴파일러에서 생성 된 임시 기존의 여러 예외 처리 영역에 걸쳐 포함 하는 레지스터 할당 버그를 해결 합니다.

상태

Microsoft는 이 문제가 '적용 대상' 섹션에 나열된 Microsoft 제품의 문제임을 확인했습니다.

도움이 더 필요하세요?

더 많은 옵션을 원하세요?

구독 혜택을 살펴보고, 교육 과정을 찾아보고, 디바이스를 보호하는 방법 등을 알아봅니다.

커뮤니티를 통해 질문하고 답변하고, 피드백을 제공하고, 풍부한 지식을 갖춘 전문가의 의견을 들을 수 있습니다.

이 정보가 유용한가요?

언어 품질에 얼마나 만족하시나요?
사용 경험에 어떠한 영향을 주었나요?
제출을 누르면 피드백이 Microsoft 제품과 서비스를 개선하는 데 사용됩니다. IT 관리자는 이 데이터를 수집할 수 있습니다. 개인정보처리방침

의견 주셔서 감사합니다!

×