Conectați-vă cu Microsoft
Conectați-vă sau creați un cont
Salut,
Selectați un alt cont.
Aveți mai multe conturi
Alegeți contul cu care doriți să vă conectați.

Acest articol descrie o remediere rapidă pentru Microsoft Visual Studio 2015 Update 3. Remedierea rapidă conține mai multe remedieri pentru Visual C++ optimizer și generator de cod (c2.dll). Pentru mai multe informații, consultați secțiunea "probleme care sunt remediate în această remediere rapidă".

Rezolvare

Cum se obține această remediere rapidă

Fişierul următor este disponibil pentru descărcare de la Microsoft Download Center:

Download Descărcați acum pachetul de remediere rapidă.

Pentru mai multe informaţii despre cum să descărcați fișierele de suport Microsoft, faceţi clic pe următorul număr de articol pentru a vedea articolul în baza de cunoştinţe Microsoft:

119591 cum se obțin fișierele de asistență Microsoft de la serviciile onlineMicrosoft a scanat acest fișier pentru viruşi. Microsoft utilizează cele mai actualizate software pentru detectarea virușilor care sunt disponibile la data la care fișierul a fost postat. Fisierul este stocat pe servere securizate care ajută la împiedicarea modificărilor neautorizate a fișierului.

Cerințe preliminare

Pentru a aplica această remediere rapidă, trebuie să aveți Visual Studio 2015 Update instalat 3.

Cerinţă de repornire

Trebuie să reporniți computerul după aplicarea acestei remedieri rapide, dacă se utilizează nici o instanță a Visual Studio.

Informații despre înlocuirea remedierilor rapide

Această remediere rapidă nu înlocuiește alte remedieri rapide.

Probleme remediate în această remediere rapidă

Această remediere rapidă conține remedieri pentru următoarele probleme:

  • Remediază o problemă în optimizer când ridicat un magazin de buclă varianta condițională din afara o buclă: #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; }

     

  • Remediere pentru un număr întreg division defect în 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; }

     

  • Remediere pentru un număr întreg division defect în 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; }

     

  • Remediere pentru un număr întreg division defect în 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); }

     

  • Remediere pentru o cădere în optimizer pentru împărţirea de 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; }

     

  • Remediază o stack overflow în 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; }

     

  • Remediere pentru generarea de cod incorect când eliminați care implică mobilă redundantă punct conversii conversia un parametru int32 la 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; }

     

  • Remediază o cădere în optimizer când divizare flux grafic noduri într-o instrucţiune implicit al unui bloc de comutare, pentru mai multe detalii, consultați https://bugs.chromium.org/p/chromium/issues/detail?id=627216#c15.

  • Remediază o eroare în buclă optimizer unde efectuăm incorecte putere reducerea nesemnate asincrone secundar variabilele care sunt multipli de variabila asincrone principală: #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); }

     

  • Oferă o soluție pentru C4883 ": function dimensiunea suprimă optimizări". Atunci când optimizer vede funcții care sunt masiv, acesta va scala înapoi optimizări efectuate de acesta. Se va genera o avertizare C4883 atunci când face acest lucru, dacă ați activat avertizare prin /we4883. Dacă doriți să suprascrie această decizie pentru a suprima optimizări, throw parametrul /d2OptimizeHugeFunctions.

  • Remedii pentru o cădere compilator în c2! PpCanPropagateForward atunci când efectuați optimizări pe x64.

  • Remedii pentru buclă optimizer erori care implică o reducere de putere variabila asincrone incorecte.

  • Remedii pentru rearanjarea incorecte de expresii care implică citiri și scrie de memorie din cauza verificarea alias incorecte.

  • Remedii pentru un registru repartitor bug care implică un compilator generat temporare existente prin mai multe excepție tratarea regiuni.

Stare

Microsoft a confirmat că aceasta este o problemă cu produsele Microsoft enumerate în secţiunea „Se aplică la".

Aveți nevoie de ajutor suplimentar?

Doriți mai multe opțiuni?

Explorați avantajele abonamentului, navigați prin cursurile de instruire, aflați cum să vă securizați dispozitivul și multe altele.

Comunitățile vă ajută să adresați întrebări și să răspundeți la întrebări, să oferiți feedback și să primiți feedback de la experți cu cunoștințe bogate.

Au fost utile aceste informații?

Cât de mulțumit sunteți de calitatea limbajului?
Ce v-a afectat experiența?
Apăsând pe Trimitere, feedbackul dvs. va fi utilizat pentru a îmbunătăți produsele și serviciile Microsoft. Administratorul dvs. IT va avea posibilitatea să colecteze aceste date. Angajamentul de respectare a confidențialității.

Vă mulțumim pentru feedback!

×