Este artículo describe un paquete de hotfix para Microsoft Visual Studio 2015 actualización 3. La revisión contiene varias correcciones para el optimizador de Visual C++ y el generador de código (c2.dll). Para obtener más información, consulte la sección "problemas corregidos en esta revisión".

Solución

Cómo obtener esta revisión.

El siguiente archivo está disponible para su descarga desde el Centro de descarga de Microsoft:

Download Descargue ahora el paquete de revisiones.

Para obtener más información acerca de cómo descargar archivos de soporte técnico de Microsoft, haga clic en el número de artículo siguiente para ver el artículo en Microsoft Knowledge Base:

119591 cómo obtener archivos de soporte técnico de Microsoft desde los servicios en líneaMicrosoft analizó este archivo en busca de virus. Microsoft ha utilizado el software de detección de virus más reciente que estaba disponible en la fecha en que se publicó el archivo. El archivo se almacena en servidores seguros que ayudan a evitar cambios no autorizados en el archivo.

Requisitos previos

Para aplicar este hotfix, debe tener Visual Studio 2015 actualización 3 instalado.

Requisito de reinicio

Tendrá que reiniciar el equipo después de aplicar esta revisión si no se utiliza ninguna instancia de Visual Studio.

Información de reemplazo de revisión

Este hotfix no sustituye a otras revisiones.

Problemas corregidos en esta revisión

Este hotfix contiene las correcciones para los siguientes problemas:

  • Corrige un error en el optimizador cuando la elevación de un almacén de variante de bucle condicional fuera de un bucle: #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; }

     

  • Corrección de un error de división de entero en el optimizador de: #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; }

     

  • Corrección de un error de división de entero en el optimizador de: 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; }

     

  • Corrección de un error de división de entero en el optimizador de: 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); }

     

  • Corrección para un bloqueo en el optimizador para la división de MIN_INT por -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; }

     

  • Resuelve un desbordamiento de pila en el optimizador: #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; }

     

  • Corrección para la generación de código incorrecto al quitar redundantes flotante punto conversiones que implica convierten un parámetro int32 a 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; }

     

  • Corrige un error en el optimizador cuando división nodos del gráfico de flujo en una instrucción por defecto de un bloque switch, para obtener más detalles, ven https://bugs.chromium.org/p/chromium/issues/detail?id=627216#c15.

  • Corrige un error en el optimizador de bucle en el que realizar la reducción de intensidad incorrecta de variables sin signo inducción secundaria que son múltiplos de la variable principal de inducció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); }

     

  • Ofrece una solución para C4883 ": tamaño de función suprime las optimizaciones". Cuando el optimizador considera funciones que son grandes, las optimizaciones que realiza se escalará atrás. Se emitirá una advertencia C4883 cuando hace esto, si ha habilitado la advertencia a través de /we4883. Si desea ignorar esta decisión para suprimir las optimizaciones, poner el conmutador /d2OptimizeHugeFunctions.

  • ¡Correcciones para un error de compilador en c2! PpCanPropagateForward al realizar optimizaciones en x64.

  • Correcciones para errores de optimizador de bucle que impliquen la reducción de intensidad variable de inducción incorrecta.

  • Correcciones para reordenar incorrecto de expresiones que impliquen lecturas y escribe en la memoria debido a comprobación de alias incorrecto.

  • Correcciones para un error del asignador de registro que implica una generada por el compilador temporal existente en varias regiones de control de excepciones.

Estado

Microsoft ha confirmado que se trata de un problema de los productos de Microsoft que se enumeran en la sección "Aplicable a".

¿Necesita más ayuda?

Ampliar sus conocimientos
Explorar los cursos
Obtener nuevas características primero
Unirse a Microsoft Insider

¿Le ha sido útil esta información?

¿Cuál es tu grado de satisfacción con la calidad del lenguaje?
¿Qué ha afectado a tu experiencia?

¡Gracias por sus comentarios!

×