Šajā rakstā ir aprakstīts Microsoft Visual Studio 2015 atjauninājums 3 labojumfailu pakotni. Labojumfails ir vairāki labojumi un Visual C++ optimizators koda ģenerators (c2.dll). Lai iegūtu papildinformāciju, skatiet sadaļu "problēmas, kas tiek labotas, izmantojot šo labojumfailu".
Risinājums
Kā iegūt šo labojumfailu
Šo failu var lejupielādēt no Microsoft lejupielādes centra:Lejupielādēt labojumfailu pakotni tūlīt. Lai iegūtu papildinformāciju par to, kā lejupielādēt Microsoft atbalsta failus, noklikšķiniet uz šī raksta numura un lasiet Microsoft zināšanu bāzes rakstu:
119591 kā iegūt Microsoft atbalsta failus no tiešsaistes pakalpojumiemMicrosoft ir skenējusi šo failu, nav vīrusu. Korporācija Microsoft izmantoja visjaunāko vīrusu noteikšanas programmatūru, kas bija pieejama faila izlikšanas datumā. Fails ir saglabāts serveros ar paaugstinātu drošību; tas palīdz aizsargāt failu no nesankcionētu izmaiņu veikšanas.
Priekšnosacījumi
Lai lietotu šo labojumfailu, datorā jābūt instalētai Visual Studio 2015 3. atjauninājumu instalēšanas.
Restartēšanas nepieciešamība
Iespējams, būs jārestartē dators pēc šī labojumfaila lietošanas, ja tiek izmantota nekādā gadījumā Visual Studio.
Informācija par labojumfaila aizstāšanu
Šis labojumfails neaizstāj citus labojumfailus.
Šajā labojumfailā novērsto problēmu
Šajā labojumfailā ir iekļauti labojumi par šādiem jautājumiem:
-
Novērš kļūdu optimizators, kad celšanas cilpas variants nosacījuma veikalu ārpus cikls: #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; }
-
Labojums par optimizators vesela skaitļa dalīšanas kļūda: #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; }
-
Labojums par optimizators vesela skaitļa dalīšanas kļūda: 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; }
-
Labojums par optimizators vesela skaitļa dalīšanas kļūda: 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); }
-
Noteikt par optimizators avārija MIN_INT nodaļu, -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; }
-
Novērš steka pārpilde optimizators: #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; }
-
Nepareiza koda ģenerēšana, noņemot liekos peldošu punktu pārvēršana ar pārvērst int32 parametru f64 Fix: #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; }
-
Novērš avārijas optimizators, sadalot plūsmas grafs mezglu noklusējuma paziņojumu slēdzis bloku, lai iegūtu plašāku informāciju, skatiet https://bugs.chromium.org/p/chromium/issues/detail?id=627216#c15.
-
Novērš kļūdu cilpa optimizators kur mēs veiktu parakstīts sekundārā indukcijas mainīgos, kas ir primārais indukcijas mainīgais dalītāji nepareizs stiprums samazināšana: #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); }
-
Risinājums piedāvā C4883 ": funkcija lieluma izlaiž optimizācijas". Kad optimizators redz funkcijas, kas ir liela, tā tiks mēroga atpakaļ optimizācijas, ko tas veic. Tā izdos C4883 brīdinājumu, kad tas tiek darīts, aktivizējot brīdinājumu pa /we4883. Ja vēlaties ignorēt šo lēmumu pārtraukt optimizācijas, mest slēdzi /d2OptimizeHugeFunctions.
-
Labojumi kompilators avārija C2! PpCanPropagateForward, veicot optimizācijas x64.
-
Cilpas optimizators kļūdām, kas nepareizi indukcijas mainīgais spēks samazināšana labojumi.
-
Izteiksmes, kas ietver nolasa nepareizi pārkārtošana labojumi un raksta atmiņas dēļ nepareizi aizstājvārds pārbaudi.
-
Labojumi reģistra iegūšanas kļūdu, kas ietver kompilators ģenerē pagaidu pastāv starp vairākiem izņēmumu apstrādes reģionu.
Statuss
Korporācija Microsoft ir apstiprinājusi, ka šī problēma pastāv Microsoft produktos, kas ir minēti sadaļā "Attiecas uz".