Prijavite se pomoću Microsoft naloga
Prijavite se ili kreirajte nalog.
Zdravo,
Izaberite drugi nalog.
Imate više naloga
Odaberite nalog pomoću kojeg želite da se prijavite.

Ovaj članak opisuje u obliku paketa za Microsoft Visual Studio 2015 Update 3. Hitni popravak sadrži nekoliko ispravki za Visual C++ optimizator i generator koda (c2.dll). Za više informacija pogledajte odeljakproblemi koji su rešeni u ovaj prilagodbeni popravak”.

Rezolucija

Kako da nabavite ovaj prilagodbeni popravak

Sledeća datoteka je dostupna za preuzimanje sa lokacije Microsoft Download Center:

Download Odmah preuzmite paket hitnih ispravki.

Za više informacija o načinu preuzimanja Microsoft datoteka za podršku, kliknite na sledeći broj članka da biste videli članak u Microsoft bazi znanja:

119591 kako nabaviti Microsoft datoteke podrške kroz usluge na mrežiMicrosoft je skenirala ovu datoteku protiv virusa. Microsoft je koristio najnoviji softver za otkrivanje virusa koji je bio dostupan na datum objavljivanja datoteke. Datoteka se čuva na serverima sa poboljšanom bezbednošću koji sprečavaju neovlaštene izmjene datoteke.

Preduslovi

Da biste primenili ovaj hitni popravak, morate imati vizuelni 2015 godine studija Update 3 instaliran.

Ponovnim pokretanjem

Ti možda morati ponovo pokrenuti računalo nakon što primijenite ovaj hitni popravak ako nema instanci programa Visual Studio koristi.

Informacije o zameni hitne

Ova hitna ispravka ne zamenjuje druge hitne popravke.

Problemi koje rješava ovaj prilagodbeni popravak

Ova hitna ispravka sadrži ispravke za sljedećih problema:

  • Rešava bubu u optimizator kada dizanju Lup-varijanta uslovno radnju izvan petlji: #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; }

     

  • Ispravka za greška broj divizija u optimizator: #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; }

     

  • Ispravka za greška broj divizija u optimizator: 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; }

     

  • Ispravka za greška broj divizija u optimizator: 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); }

     

  • Popravi za sudar u optimizator za podelu MIN_INT po -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; }

     

  • Popravlja se prekoračenje slaganja u optimizator: #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; }

     

  • Popravi netačan kôd generaciju kada uklanjanja suvišnih plutajuće tačka konverzije koje uključuju konvertovali parametrom 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; }

     

  • Popravlja sudar u optimizator kada razdeljivanju protok graph čvorova u podrazumevani izvod prekidač blok, za više detalja, vidi https://bugs.chromium.org/p/chromium/issues/detail?id=627216#c15.

  • Rešava bubu u petlji optimizator gde vršimo netačne snagu smanjenje nepotpisani sekundarni indukcioni promenljivih koje su umnoške primarni indukcioni promenljiva: #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); }

     

  • Nudi zaobilazno rješenje za C4883 „: funkcija veličine suzbija optimizacije”. Kada je optimizator vidi funkcije koje su ogromne, to će skali nazad optimizacije koje ona obavlja. Će izdati upozorenje C4883 kada se to desi, ako ste omogućili upozorenja putem /we4883. Ako želite da zamenite ovu odluku da suzbiju optimizacije, skretnicu /d2OptimizeHugeFunctions.

  • Popravlja se za sudar prevodilac u c2! PpCanPropagateForward kada izvršavate optimizacije na x64.

  • Ispravke za petlju optimizator bube koje uključuju netačne indukcioni varijabilnom snagu smanjenje.

  • Popravlja za neispravne načelo izraza koji uključuju čitanja & piše da memorije zbog neispravne pseudonim provere.

  • Popravlja za bubu dodeljivač dnevnik koji podrazumeva da je prevodilac generisan privremene postojeće preko više izuzetak koji rukovodi regionima.

Status

Microsoft je potvrdio da je ovo problem kod Microsoft proizvoda koji su navedeni u odeljku „Odnosi se na”.

Da li vam je potrebna dodatna pomoć?

Želite još opcija?

Istražite pogodnosti pretplate, pregledajte kurseve za obuku, saznajte kako da obezbedite uređaj i još mnogo toga.

Zajednice vam pomažu da postavljate pitanja i odgovarate na pitanja, dajete povratne informacije i čujete mišljenje od stručnjaka sa bogatim znanjem.

Da li su vam ove informacije koristile?

Koliko ste zadovoljni kvalitetom jezika?
Šta je uticalo na vaše iskustvo?
Kada kliknete na dugme Prosledi“, vaše povratne informacije će se koristiti za poboljšanje Microsoft proizvoda i usluga. Vaš IT administrator će moći da prikupi ove podatke. Izjava o privatnosti.

Hvala vam na povratnim informacijama!

×