Bài viết này mô tả gói hotfix dành cho Microsoft Visual Studio 2015 Update 3. Hotfix chứa các bản vá để tối ưu hóa Visual C++ và trình tạo mã (c2.dll). Để biết thêm thông tin, hãy xem phần "các sự cố đã được khắc phục trong hotfix này".

Giải pháp

Làm thế nào để lấy hotfix này

Tệp sau đây có sẵn để tải xuống từ Trung tâm Tải xuống Microsoft:

Download Tải xuống gói bản vá nóng ngay bây giờ.

Để biết thêm thông tin về cách tải xuống tệp hỗ trợ của Microsoft, hãy bấm vào số bài viết sau để xem bài viết trong Cơ sở Kiến thức của Microsoft:

119591 cách tải xuống các tệp hỗ trợ Microsoft từ dịch vụ trực tuyếnMicrosoft đã quét vi-rút tệp này. Microsoft đã sử dụng phần mềm phát hiện vi-rút mới nhất đã có vào ngày tệp được đăng. Tệp được lưu trữ trên máy chủ được tăng cường bảo mật giúp ngăn chặn mọi thay đổi trái phép đối với tệp.

Điều kiện tiên quyết

Để áp dụng hotfix này, bạn phải có Visual Studio 2015 Update 3 cài đặt.

Yêu cầu khởi động lại

Bạn có thể phải khởi động lại máy tính sau khi bạn áp dụng hotfix này nếu không có phiên bản Visual Studio đang được sử dụng.

Thông tin thay thế cập nhật nóng

Hotfix này không thay thế các hotfix.

Sự cố được khắc phục trong hotfix này

Hotfix này có khắc phục sự cố sau:

  • Khắc phục lỗi trong trình tối ưu hoá khi đặt vòng Phiên bản điều kiện kho lưu trữ bên ngoài vòng: #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; }

     

  • Giải pháp cho một số bộ phận lỗi trong trình tối ưu hoá: #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; }

     

  • Giải pháp cho một số bộ phận lỗi trong trình tối ưu hoá: 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; }

     

  • Giải pháp cho một số bộ phận lỗi trong trình tối ưu hoá: 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); }

     

  • Khắc phục sự cố trong trình tối ưu hoá tách MIN_INT bằng -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; }

     

  • Khắc phục tràn ngăn xếp trong trình tối ưu hoá: #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; }

     

  • Khắc phục sự cố tạo mã không chính xác khi loại bỏ dư nổi điểm chuyển đổi liên quan đến chuyển đổi một số 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; }

     

  • Khắc phục trình tối ưu hoá sập khi chia tách dòng đồ họa nút trong câu lệnh mặc định của một khối chuyển, để biết thêm chi tiết, hãy xem https://bugs.chromium.org/p/chromium/issues/detail?id=627216#c15.

  • Khắc phục lỗi trong trình tối ưu hoá vòng mà chúng tôi thực hiện không đúng sức mạnh giảm dấu phụ cảm biến có bội chính cảm biến: #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); }

     

  • Cung cấp giải pháp cho C4883 ": chức năng kích thước ngăn chặn tối ưu hóa". Khi trình tối ưu hoá thấy chức năng lớn, nó sẽ leo trở lại tối ưu hóa thực hiện. Nó sẽ phát cảnh báo C4883 khi đó, nếu bạn đã bật cảnh báo qua /we4883. Nếu bạn muốn thay thế này nhằm ngăn chặn tối ưu hóa, ném /d2OptimizeHugeFunctions chuyển.

  • Bản sửa lỗi cho trình biên soạn sập trong c2. PpCanPropagateForward khi bạn thực hiện tối ưu hóa x64.

  • Bản vá lỗi tối ưu hóa vòng lặp có liên quan đến đúng cảm biến sức mạnh giảm.

  • Sửa chữa để sắp xếp lại chính xác của biểu thức có liên quan đến đọc và ghi vào bộ nhớ vì không đúng bí danh kiểm tra.

  • Khắc phục các lỗi cấp phát đăng ký liên quan đến một trình biên dịch tạo ra tạm thời sẵn có trên nhiều ngoại lệ xử lý vùng.

Trạng thái

Microsoft đã xác nhận rằng đây là sự cố trong sản phẩm của Microsoft được liệt kê trong phần "Áp dụng cho".

Bạn cần thêm trợ giúp?

Phát triển các kỹ năng của bạn
Khám phá nội dung đào tạo
Sở hữu tính năng mới đầu tiên
Tham gia Microsoft dùng nội bộ

Thông tin này có hữu ích không?

Bạn hài lòng đến đâu với chất lượng dịch thuật?
Điều gì ảnh hưởng đến trải nghiệm của bạn?

Cảm ơn phản hồi của bạn!

×