Перейти до основного
Підтримка
Вхід
Вхід за допомогою облікового запису Microsoft
Увійдіть або створіть обліковий запис.
Вітаємо,
Виберіть інший обліковий запис.
У вас є кілька облікових записів
Виберіть обліковий запис, за допомогою якого потрібно ввійти.

У цій статті описується пакет виправлень, для Microsoft Visual Studio 2015 оновлення 3. Деякі виправлення Visual C++ оптимізатора і генератор-код (c2.dll), містить виправлення. Щоб отримати додаткові відомості див. розділ "проблеми, що містить це виправлення".

Вирішення

Як отримати це виправлення

Файл можна завантажити з центру завантажень Microsoft:

Download Завантажити пакет виправлень.

Щоб отримати додаткові відомості про завантаження файлів підтримки Microsoft, клацніть номер статті в базі знань Microsoft:

119591 , як отримати файли технічної підтримки Майкрософт від інтерактивних служб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; }

     

  • Виправити помилку відділу ціле число в optimizer: #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; }

     

  • Виправити помилку відділу ціле число в optimizer: 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; }

     

  • Виправити помилку відділу ціле число в optimizer: 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); }

     

  • Виправлення для аварійне завершення роботи, на які optimizer, для розподілу 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; }

     

  • Усуває переповнення стека, на які optimizer: #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.

  • Виправлення помилки в циклі optimizer де ми виконувати, неправильні зниження непідписані додаткової асинхронних змінних, які наборами з основного асинхронних змінної: #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. Якщо потрібно змінити це рішення, щоб заборонити оптимізації, throw /d2OptimizeHugeFunctions перемикач.

  • Виправлення для програми компілятор аварійне завершення роботи у c2! PpCanPropagateForward під час виконання оптимізації на x64.

  • Доступно цикл оптимізатора помилок, пов'язаних неправильні асинхронних зниження змінної.

  • Виправлення для неправильне змінення виразів, які стосуються зчитує і записує через неправильне alias, перевірка пам'яті.

  • Доступно для реєстрації розподільник помилка, яка включає в себе створеного компілятор тимчасові існуючі через кілька винятків, обробки областей.

Стан

Корпорація Майкрософт підтвердила існування цієї неполадки у продуктах Майкрософт, перелічених у розділі "Застосовується до".

Потрібна додаткова довідка?

Потрібні додаткові параметри?

Ознайомтеся з перевагами передплати, перегляньте навчальні курси, дізнайтесь, як захистити свій пристрій тощо.

Спільноти допомагають ставити запитання й відповідати на них, надавати відгуки та дізнаватися думки висококваліфікованих експертів.

Чи ця інформація була корисною?

Наскільки ви задоволені якістю мови?
Що вплинуло на ваші враження?
Натиснувши кнопку "Надіслати", ви надасте свій відгук для покращення продуктів і служб Microsoft. Ваш ІТ-адміністратор зможе збирати ці дані. Декларація про конфіденційність.

Дякуємо за відгук!

×