Bei Microsoft anmelden
Melden Sie sich an, oder erstellen Sie ein Konto.
Hallo,
Wählen Sie ein anderes Konto aus.
Sie haben mehrere Konten.
Wählen Sie das Konto aus, mit dem Sie sich anmelden möchten.

Dieser Artikel beschreibt ein Hotfix-Paket für Microsoft Visual Studio 2015 Update 3. Der Hotfix enthält mehrere Hotfixes für Visual C++-Optimierer und Code-Generator (c2.dll). Weitere Informationen finden Sie im Abschnitt ", die in diesem Update behobene, Probleme".

Problemlösung

Wie Sie diesen Hotfix erhalten

Die folgende Datei steht zum Download im Microsoft Download Center zur Verfügung:

Download Downloaden Sie das Hotfix-Paket jetzt.

Für weitere Informationen darüber, wie Sie Microsoft Support-Dateien herunterladen können, klicken Sie auf die folgende Artikelnummer, um den Artikel in der Microsoft Knowledge Base anzuzeigen:

119591 so erhalten Sie Microsoft Support-DateienMicrosoft hat diese Datei auf Viren überprüft. Microsoft hat die zum Zeitpunkt der Veröffentlichung der Datei aktuell verfügbare Virenerkennungssoftware verwendet. Die Datei wird auf Servern mit erhöhter Sicherheit gespeichert, wodurch nicht autorisierten Änderungen an der Datei vorgebeugt wird.

Voraussetzungen

Um diesen Hotfix anwenden zu können, müssen Sie Visual Studio 2015 Update 3 installiert haben.

Neustartanforderung

Sie müssen den Computer neu starten, nachdem Sie diesen Hotfix anwenden, wenn keine Instanz von Visual Studio verwendet wird.

Informationen zu ersetzten Hotfixes

Dieser Hotfix ersetzt nicht anderen Hotfixes.

In diesem Update behobene Probleme

Dieser Hotfix behebt die folgenden Probleme:

  • Behebt einen Fehler in der Optimierung beim heben eines bedingten Schleife Variante Speicher außerhalb einer Schleife: #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; }

     

  • Update für einen ganzzahligen Division Fehler in der Optimierung: #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; }

     

  • Update für einen ganzzahligen Division Fehler in der Optimierung: 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; }

     

  • Update für einen ganzzahligen Division Fehler in der Optimierung: 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); }

     

  • Update für einen Absturz in der Optimierung für die Aufteilung der MIN_INT von-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; }

     

  • Behebt einen Stapelüberlauf in der Optimierung: #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; }

     

  • Korrigieren Sie falscher Code Generation beim Entfernen redundante floating Point mit int32-Parameter auf f64 konvertieren: #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; }

     

  • Behebt einen Absturz in der Optimierer beim Aufteilen Flow Graph Knoten in einer Standard Schalterblock, Weitere Informationen finden Sie unter https://bugs.chromium.org/p/chromium/issues/detail?id=627216#c15.

  • Behebt einen Fehler in der Schleife Optimierung, führen wir falsch Stärke Verringerung unsigned sekundäre Induktion Variablen, Vielfache der primären Induktion Variablen: #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); }

     

  • Bietet einen Workaround für C4883 ": Funktion Größe unterdrückt Optimierungen". Wenn der Optimierer Funktionen die massive sieht, wird es wieder ausgeführt Optimierungen skaliert. Es wird C4883 Warnung Wenn dies, wenn Sie die Warnung über /we4883 aktiviert haben. Möchten Sie diese Entscheidung Optimierungen zu überschreiben, lösen Sie /d2OptimizeHugeFunctions Switch.

  • Problembehebungen für einen Absturz Compiler c2! PpCanPropagateForward beim Ausführen von Optimierungen auf X64.

  • Korrekturen für Schleife Optimizer Fehler mit falschen Induktion Variable Stärke Reduzierung.

  • Problembehebungen für falsche Neuanordnen von Ausdrücken mit liest und schreibt Arbeitsspeicher wegen ungültiges Alias überprüfen.

  • Korrekturen für Fehler Zuweisung Register umfasst eine vom Compiler generierte temporäre vorhandenen über mehrere Regionen für die Ausnahmebehandlung.

Status

Microsoft hat bestätigt, dass es sich um ein Problem bei den Microsoft-Produkten handelt, die im Abschnitt „Eigenschaften“ aufgeführt sind.

Benötigen Sie weitere Hilfe?

Möchten Sie weitere Optionen?

Erkunden Sie die Abonnementvorteile, durchsuchen Sie Trainingskurse, erfahren Sie, wie Sie Ihr Gerät schützen und vieles mehr.

In den Communities können Sie Fragen stellen und beantworten, Feedback geben und von Experten mit umfassendem Wissen hören.

War diese Information hilfreich?

Wie zufrieden sind Sie mit der Sprachqualität?
Was hat Ihre Erfahrung beeinflusst?
Wenn Sie auf "Absenden" klicken, wird Ihr Feedback zur Verbesserung von Produkten und Diensten von Microsoft verwendet. Ihr IT-Administrator kann diese Daten sammeln. Datenschutzbestimmungen.

Vielen Dank für Ihr Feedback!

×