Влизане с 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 ключа.

  • Корекции за компилатор срив в c2! PpCanPropagateForward, когато извършвате оптимизации за x64.

  • Корекции за цикъл Оптимизатор грешки, които включват неправилно въвеждане променлива сила намаление.

  • Корекции за неправилно пренареждане на заявките, които включват чете и записва паметта поради неправилно псевдоним проверка.

  • Корекции за разпределение регистър грешка, която включва компилатор генерирано временно съществуващи в няколко изключение обработка области.

Статус

Microsoft потвърждава, че това е проблем в продуктите на Microsoft, изброени в раздела "Отнася се за".

Нуждаете се от още помощ?

Разширете уменията си
Преглед на обучението
Получавайте първи новите функции
Присъединете се към Microsoft приобщени

Беше ли полезна тази информация?

Доколко сте доволни от качеството на езика?
Какво е повлияло на вашия потребителски опит?

Благодарим ви за обратната връзка!

×