Microsoft Visual Studio 2015 업데이트 3에 대 한 핫픽스 패키지를 설명합니다. 핫픽스 Visual C++ 최적화와 코드 생성기 (c2.dll)에 몇 가지 수정 프로그램도 포함 되어 있습니다. 자세한 내용은 "문제는이 핫픽스 해결" 절을 참조 하십시오.
해결 방법
이 핫픽스를 구하는 방법
다음 파일은 Microsoft 다운로드 센터에서 다운로드할 수 있습니다.
핫픽스 패키지를 지금 다운로드 하십시오.
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 제품의 문제임을 확인했습니다.