REVISIÓN: El desplazamiento que se genera para tener acceso a miembros de una estructura o un miembro de clase es incorrecto cuando se compila una aplicación utilizando la opción /Ox o/O2 en Visual Studio 2008 SP1


Síntomas


Considere el siguiente escenario.
  • Crear una aplicación que carga un byte de una estructura o de una clase en Microsoft Visual Studio 2008 Service Pack 1 (SP1).
  • Activar la opción de optimización de /Ox o la optimización/O2 .
  • Compilar la aplicación utilizando una configuración de lanzamiento para la x64 plataforma.
En este escenario, el desplazamiento que se genera para tener acceso a los miembros de la estructura o el miembro de clase es incorrecto.

Este problema produce sólo cuando el tamaño de la estructura y el desplazamiento o el tamaño de clase y el desplazamiento es igual a uno de los siguientes pares:

  • (14,13)
  • (15,13)
  • (22,21)
  • (23,21)
  • (30,29)
  • (31,29)

Solución


Información de la revisión

Ahora hay una revisión compatible de Microsoft. Sin embargo, se pretende corregir el problema que se describe en este artículo. Aplíquela sólo a sistemas que experimenten este problema específico. Esta revisión puede ser sometida a comprobaciones adicionales. Por lo tanto, si no se ve muy afectado por este problema, recomendamos que espere al próximo service pack de Visual Studio 2008 que contenga este hotfix.

Para resolver este problema inmediatamente, póngase en contacto con los servicios de soporte técnico de Microsoft para obtener la revisión. Para obtener una lista completa de números de teléfono de los servicios de soporte al cliente de Microsoft e información acerca de los costos de soporte técnico, visite el siguiente sitio Web de Microsoft:Nota: En casos especiales, los costos derivados normalmente de las llamadas al soporte técnico pueden cancelarse si un profesional de soporte técnico de Microsoft determina que una actualización específica resolverá el problema. Los costos habituales de soporte se aplicarán a las preguntas de soporte técnico adicionales y problemas que no guarden relación con la actualización en cuestión.

Requisitos previos

Debe tener Visual Studio 2008 Service Pack 1 instalado para aplicar esta revisión.

Requisito de reinicio

No es necesario que reinicie el equipo después de aplicar este hotfix.

Información de reemplazo de revisión

Este hotfix no sustituye a otras revisiones.

Información de archivo

La versión en inglés de esta revisión tiene los atributos de archivo (o atributos del archivo más reciente) mostrados en la tabla siguiente. Las fechas y horas de estos archivos se muestran en la hora Universal coordinada (UTC). Al ver la información del archivo, se convierte en hora local. Para encontrar la diferencia entre la hora UTC y la hora local, utilice la ficha Zona horaria en el elemento de Fecha y hora del Panel de control.
Nombre del archivoVersión del archivoTamaño de archivoFechaHoraPlataforma
C2.dll15.0.30729. 40822,283,32019-Mar-200905:13x86
C2.dll15.0.30729.40822,36 1,65619-Mar-200905:13x86
C2.dll15.0.30729.40827,528 3,0119-Mar-200905:13x64
Link.exe9.0.30729.408254,520 1,019-Mar-200905:13x64
Link.exe9.0.30729.4082799, 03219-Mar-200905:13x86

Solución alternativa


Para evitar este problema, agregue uno o más miembros ficticio "unsigned char" para ampliar el tamaño de la estructura o de la clase al múltiplo más pequeño de ocho bytes. Por ejemplo, ampliar 14 bytes a 16 bytes.

Estado


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

Más información


Para obtener más información acerca de la terminología de la actualización de software, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base:
824684 descripción de la terminología estándar que se utiliza para describir las actualizaciones de software de Microsoft

Pasos para reproducir el problema

  1. Crear una aplicación que se denomina Test.cpp utilizando el siguiente código de Visual Studio 2008 SP1:
    typedef struct DskDecimal
    {
    unsigned char precision;
    unsigned char scaleFactor;
    unsigned short value[ 5];
    unsigned char maxPrecision;
    unsigned char maxScaleFactor;
    } DskDecimal;

    int main()
    {
    DskDecimal decimal;
    decimal.maxScaleFactor = 4;
    DskDecimal self = decimal;
    return self.maxScaleFactor;
    }
  2. Compilar la aplicación mediante el siguiente comando:
    CL test.cpp/MD/O2
El resultado esperado es 4. Sin embargo, el resultado real es 0.