Přihlásit se pomocí účtu Microsoft
Přihlaste se nebo si vytvořte účet.
Dobrý den,
Vyberte jiný účet.
Máte více účtů.
Zvolte účet, pomocí kterého se chcete přihlásit.

Tento článek popisuje balíček oprav hotfix pro aplikaci Microsoft Visual Studio 2015 aktualizace 3. Tato oprava hotfix obsahuje opravy pro optimalizaci Visual C++ a generátor kódu (c2.dll). Další informace naleznete v části "problémy vyřešené v této opravě hotfix".

Řešení

Jak získat opravy hotfix

Následující soubor je k dispozici pro stažení z Microsoft Download Center:

Download Stáhněte balíček opravy hotfix.

Pro více informací o tom, jak stahovat soubory podpory společnosti Microsoft, klepněte na následující číslo článku v databázi Microsoft Knowledge Base:

119591 jak získat soubory podpory společnosti Microsoft ze serverů služeb onlineMicrosoft zkontroloval tento soubor na přítomnost virů. Společnost Microsoft použila aktuální antivirový software, který byl k dispozici k datu, kdy byl soubor vydán. Soubor je uložen na zabezpečených serverech, které pomáhají zabránit neoprávněným změnám v souboru.

Předpoklady

Chcete-li nainstalovat tuto opravu hotfix, musí mít Visual Studio 2015 Update 3 nainstalován.

Požadavek na restartování

Bude pravděpodobně nutné restartovat počítač po instalaci této opravy hotfix Pokud žádná instance Visual Studio je používán.

Informace o nahrazení opravy hotfix

Tato oprava hotfix není nahradit další opravy hotfix.

Problémy vyřešené v této opravě hotfix

Tato oprava hotfix obsahuje opravy pro následující problémy:

  • Opravuje chybu v okně Optimalizace při zvedání podmíněné smyčky varianty úložiště mimo smyčku: #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; }

     

  • Oprava pro chybu dělení celé číslo v okně Optimalizace: #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; }

     

  • Oprava pro chybu dělení celé číslo v okně Optimalizace: 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; }

     

  • Oprava pro chybu dělení celé číslo v okně Optimalizace: 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); }

     

  • Oprava pro chybu v okně Optimalizace pro dělení 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; }

     

  • Řeší přetečení zásobníku v okně Optimalizace: #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; }

     

  • Oprava pro nesprávné generování kódu při odebírání nadbytečných plovoucí bod převody zahrnující převedení int32 parametr 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; }

     

  • Řeší selhání v okně Optimalizace při dělení uzlů grafu toku výchozí příkaz switch bloku, další podrobnosti viz https://bugs.chromium.org/p/chromium/issues/detail?id=627216#c15.

  • Opravuje chybu v optimalizace smyčky kde můžeme provést snížení pevnosti nesprávné nepodepsané sekundární indukční proměnných, které jsou násobky proměnné primární indukční: #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); }

     

  • Nabízí řešení pro C4883 ": funkce velikost potlačí optimalizace". Když optimalizace analyzuje funkce, které jsou masivní, ho změní měřítko zpět optimalizace, které provádí. Ji vás upozorní, C4883 Pokud je to, pokud jste povolili upozornění prostřednictvím /we4883. Pokud chcete potlačit toto rozhodnutí potlačit optimalizace, vyvolejte /d2OptimizeHugeFunctions přepínač.

  • Řeší zhroucení kompilátoru v c2! PpCanPropagateForward při provádění optimalizace v x64.

  • Opravy chyb optimalizace smyčky, zahrnující snížení proměnné sílu nesprávné indukční.

  • Řeší nesprávné pořadí výrazů, které zahrnují čtení a zapíše do paměti kvůli kontrole správné alias.

  • Opravy pro chyby přidělování registru, které zahrnuje generovaný kompilátoru dočasné existující ve více oblastech pro zpracování výjimek.

Stav

Společnost Microsoft potvrdila, že se jedná o problém v produktech společnosti Microsoft, které jsou uvedeny v části "Platí pro".

Potřebujete další pomoc?

Chcete další možnosti?

Prozkoumejte výhody předplatného, projděte si školicí kurzy, zjistěte, jak zabezpečit své zařízení a mnohem více.

Komunity vám pomohou klást otázky a odpovídat na ně, poskytovat zpětnou vazbu a vyslechnout odborníky s bohatými znalostmi.

Byly tyto informace užitečné?

Jak jste spokojeni s kvalitou jazyka?
Co ovlivnilo váš názor?
Po stisknutí tlačítka pro odeslání se vaše zpětná vazba použije k vylepšování produktů a služeb Microsoftu. Váš správce IT bude moci tato data shromažďovat. Prohlášení o zásadách ochrany osobních údajů.

Děkujeme vám za zpětnou vazbu.

×