Logga in med Microsoft
Logga in eller skapa ett konto.
Hej,
Välj ett annat konto.
Du har flera konton
Välj det konto som du vill logga in med.

Den här artikeln beskrivs ett snabbkorrigeringspaket för Microsoft Visual Studio 2015 Update 3. Snabbkorrigeringen innehåller flera korrigeringar för Visual C++-optimering och kodgenerator (c2.dll). Mer information finns i avsnittet ”problem som korrigeras i den här snabbkorrigeringen”.

Lösning

Hur du hämtar snabbkorrigeringen

Följande fil kan hämtas från Microsoft Download Center:

Download Hämta paketet nu.

För mer information om hur du hämtar supportfiler från Microsoft klickar du på följande artikelnummer och läser artikeln i Microsoft Knowledge Base:

119591 hämta Microsoft-supportfiler från onlinetjänsterMicrosoft har genomsökt denna fil efter virus. Microsoft använde det mest aktuella antivirusprogram som var tillgängligt när filen lades upp. Filen är sparad på servrar med utökad säkerhet som hjälper till att förhindra otillåtna ändringar av den.

Förutsättningar

Om du vill installera den här snabbkorrigeringen måste du ha Visual Studio 2015 Update 3 vara installerat.

Krav på omstart

Du kan behöva starta om datorn när du har installerat den här snabbkorrigeringen om ingen instans av Visual Studio som används.

Ersättningsinformation för Hotfix

Den här snabbkorrigeringen ersätter inte andra snabbkorrigeringar.

Problem som åtgärdas i den här snabbkorrigeringen

Den här snabbkorrigeringen innehåller korrigeringar för följande problem:

  • Åtgärdar en bugg i optimering när lasten höjs en villkorlig loop-variant-butik utanför en loop: #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; }

     

  • Korrigera för ett heltal division bugg i optimering: #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; }

     

  • Korrigera för ett heltal division bugg i optimering: 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; }

     

  • Korrigera för ett heltal division bugg i optimering: 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); }

     

  • Korrigering för en krasch i optimering för delning av MIN_INT av -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; }

     

  • Åtgärdas dataspill i optimering: #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; }

     

  • Korrigering för felaktig kodgenerering när ta bort överflödiga flytande punkt konverteringar som innefattar konverterar en int32-parametern till 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; }

     

  • Korrigerar en krasch i optimering när delande flöde graph noder i en standard sammanställning av växeln block, för mer information, se https://bugs.chromium.org/p/chromium/issues/detail?id=627216#c15.

  • Åtgärdar en bugg i loop-optimering där vi gör felaktiga styrka nedsättning av osignerade sekundär induktion variabler som är multiplar av primära induktions-variabel: #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); }

     

  • Erbjuder en lösning för C4883 ”: funktionen storlek Undertrycker optimeringar”. När optimering ser funktioner som är stort, skalas det tillbaka optimeringar som den utför. Den kommer att utfärda en varning för C4883 när detta sker, om du har aktiverat varning via /we4883. Om du vill åsidosätta detta beslut att undertrycka optimeringar kasta växeln /d2OptimizeHugeFunctions.

  • Åtgärdas för ett kompilatorn kraschar i c2! PpCanPropagateForward när du utför optimeringar i x64.

  • Korrigeringar för loop optimering buggar som medför minskning av felaktiga induktion variabel styrka.

  • Korrigeringar av felaktiga uttryck som inbegriper läsningar & skriver till minne på grund av felaktiga alias kontroll.

  • Åtgärdas för ett register allokeraren programfel som innebär en kompilatorn genereras tillfälliga befintliga över flera regioner för undantagshantering.

Status

Microsoft har bekräftat att detta är ett problem i Microsoft-produkterna som nämns i avsnittet ”gäller”.

Behöver du mer hjälp?

Vill du ha fler alternativ?

Utforska prenumerationsförmåner, bläddra bland utbildningskurser, lär dig hur du skyddar din enhet med mera.

Communities hjälper dig att ställa och svara på frågor, ge feedback och få råd från experter med rika kunskaper.

Hade du nytta av den här informationen?

Hur nöjd är du med språkkvaliteten?
Vad påverkade din upplevelse?
Genom att trycka på skicka, kommer din feedback att användas för att förbättra Microsofts produkter och tjänster. IT-administratören kan samla in denna data. Sekretesspolicy.

Tack för din feedback!

×