Logg på med Microsoft
Logg på, eller opprett en konto.
Hei,
Velg en annen konto.
Du har flere kontoer
Velg kontoen du vil logge på med.

Denne artikkelen beskriver en hurtigreparasjonspakke for Microsoft Visual Studio 2015 Update 3. Hurtigreparasjonen inneholder flere hurtigreparasjoner for Visual C++-optimalisering og koden generator (c2.dll). Hvis du vil ha mer informasjon, kan du se delen "problemer som er løst i denne hurtigreparasjonen".

Løsning

Hvordan du får tak i hurtigreparasjonen

Følgende fil er tilgjengelig for nedlasting fra Microsoft Download Center:

Download Last ned hurtigreparasjonen nå.

Hvis du vil ha mer informasjon om hvordan du laster ned Microsoft-støttefiler, klikker du følgende artikkelnummer for å vise artikkelen i Microsoft Knowledge Base:

119591 hvordan du ned Microsoft-støttefiler fra elektroniske tjenesterMicrosoft har søkt etter virus i denne filen. Microsoft brukte det nyeste antivirusprogrammet som var tilgjengelig den datoen filen ble lagt ut. Filen lagres på sikkerhetsforbedrede servere som bidrar til å hindre uautoriserte endringer i filen.

Forutsetninger

Hvis du vil bruke denne hurtigreparasjonen, må du Visual Studio 2015 oppdatering 3 installert.

Krav om omstart

Du må kanskje starte datamaskinen etter at du har installert denne hurtigreparasjonen hvis ingen forekomster av Visual Studio som brukes.

Informasjon om erstatning av hurtigreparasjoner

Denne hurtigreparasjonen erstatter ikke andre hurtigreparasjoner.

Problemer som er løst i denne hurtigreparasjonen

Denne hurtigreparasjonen inneholder reparasjoner for følgende problemer:

  • Løser en feil i optimizer når hoisting en løkke-variant betinget butikk utenfor en sløyfe: #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; }

     

  • Hurtigreparasjonen for et heltall divisjon bug i 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; }

     

  • Hurtigreparasjonen for et heltall divisjon bug i 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; }

     

  • Hurtigreparasjonen for et heltall divisjon bug i 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); }

     

  • Hurtigreparasjon for et krasj i optimizer for deling av MIN_INT med -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; }

     

  • Løser en stack-overflyt i 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; }

     

  • Løse for ugyldig kodegenerering når fjerne overflødige flytende punktet konverteringer som omfatter konverterer en int32-parameter til 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; }

     

  • Løser et krasj i optimizer når Deling flyte graf noder i en standard-setning i en "switch block", hvis du vil ha mer informasjon, se https://bugs.chromium.org/p/chromium/issues/detail?id=627216#c15.

  • Løser en feil i optimizer løkke der vi utfører feil styrke reduksjon av usignert sekundære induction variabler som er multipler av den primære induction variabelen: #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); }

     

  • Gir en løsning for C4883 ": funksjonen størrelse undertrykker optimaliseringer". Når optimaliseringen ser funksjoner er massiv, vil det skalere tilbake optimaliseringer som utføres. Det vil gi en C4883 advarsel når den gjør det, hvis du har aktivert advarsel via /we4883. Hvis du vil overstyre denne beslutningen om å undertrykke optimaliseringer, kvitter /d2OptimizeHugeFunctions-bryteren.

  • Løser for kompilator krasj i c2! PpCanPropagateForward når du utfører optimalisering på x64.

  • Feilrettingsfiler for løkke optimalisering feil som involverer feil induction variabel styrke reduksjon.

  • Løser for omorganisering av feil på uttrykk som innbefatter leser og skriver til minne på grunn av ugyldig alias kontrollerer.

  • Feilrettingsfiler for en kasse tildeleren feil som involverer en kompilator generert midlertidig eksisterende på tvers av flere områder for unntaksbehandling.

Status

Microsoft har bekreftet at dette er et problem i Microsoft-produktene som er oppført i delen "Gjelder for".

Trenger du mer hjelp?

Vil du ha flere alternativer?

Utforsk abonnementsfordeler, bla gjennom opplæringskurs, finn ut hvordan du sikrer enheten og mer.

Fellesskap hjelper deg med å stille og svare på spørsmål, gi tilbakemelding og høre fra eksperter med stor kunnskap.

Var denne informasjonen nyttig?

Hvor fornøyd er du med språkkvaliteten?
Hva påvirket opplevelsen din?
Når du trykker på Send inn, blir tilbakemeldingen brukt til å forbedre Microsoft-produkter og -tjenester. IT-administratoren kan samle inn disse dataene. Personvernerklæring.

Takk for tilbakemeldingen!

×