Pierakstīties, izmantojot Microsoft
Pierakstīties vai izveidot kontu
Sveicināti!
Atlasīt citu kontu.
Jums ir vairāki konti
Izvēlieties kontu, ar kuru vēlaties pierakstīties.

Š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:

Download 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".

Nepieciešama papildu palīdzība?

Vēlaties vairāk opciju?

Izpētiet abonementa priekšrocības, pārlūkojiet apmācības kursus, uzziniet, kā aizsargāt ierīci un veikt citas darbības.

Kopienas palīdz uzdot jautājumus un atbildēt uz tiem, sniegt atsauksmes, kā arī saņemt informāciju no ekspertiem ar bagātīgām zināšanām.

Vai šī informācija bija noderīga?

Cik lielā mērā esat apmierināts ar valodas kvalitāti?
Kas ietekmēja jūsu pieredzi?
Nospiežot Iesniegt, jūsu atsauksmes tiks izmantotas Microsoft produktu un pakalpojumu uzlabošanai. Jūsu IT administrators varēs vākt šos datus. Paziņojums par konfidencialitāti.

Paldies par jūsu atsauksmēm!

×