CORRIGER : Le décalage est généré pour accéder à un membre de structure ou d’un membre de classe est incorrect lorsque vous compilez une application à l’aide de l’option /Ox ou/O2 dans Visual Studio 2008 SP1


Symptômes


Envisagez le scénario suivant.
  • Vous créez une application qui charge un octet à partir d’une structure ou d’une classe dans Microsoft Visual Studio 2008 Service Pack 1 (SP1).
  • Vous activez l’option d’optimisation /Ox ou l’option d’optimisation/O2 .
  • Vous compilez l’application à l’aide d’une configuration release pour le x64 plate-forme.
Dans ce scénario, le décalage est généré pour accéder aux membres de la structure ou le membre de classe est incorrect.

Ce problème produit uniquement lorsque la taille de la structure et le décalage ou la taille de la classe et l’offset égalent à un des suivants :

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

Résolution


Informations sur le correctif

Un correctif pris en charge est désormais disponible auprès de Microsoft. Toutefois, il est conçu pour résoudre uniquement le problème décrit dans cet article. Il s’applique uniquement aux systèmes rencontrant ce problème spécifique. Ce correctif peut subir des tests supplémentaires. Par conséquent, si vous n’êtes pas sérieusement concerné par ce problème, nous vous recommandons d’attendre le prochain service pack de Visual Studio 2008 qui comprendra ce correctif.

Pour résoudre ce problème immédiatement, contactez les Services de Support technique Microsoft pour obtenir le correctif. Pour obtenir une liste complète des numéros de téléphone des Services de Support technique Microsoft et des informations sur les coûts de support, visitez le site Web de Microsoft à l’adresse suivante :Remarque Dans des cas particuliers, des frais généralement encourus pour les appels au support technique peuvent être annulés si un technicien du support technique Microsoft détermine qu'une mise à jour spécifique peut résoudre votre problème. Les coûts habituels du support technique s’appliqueront aux autres questions et problèmes qui ne relèvent pas de la mise à jour spécifique en question.

Conditions préalables

Vous devez disposer de Visual Studio 2008 Service Pack 1 pour appliquer ce correctif.

Nécessite un redémarrage

Vous n’êtes pas obligé de redémarrer l’ordinateur après avoir appliqué ce correctif.

Informations de remplacement du correctif

Ce correctif ne remplace aucun autre correctif.

Informations sur les fichiers

La version anglaise de ce correctif dispose des attributs de fichier (ou version ultérieure) répertoriés dans le tableau suivant. Les dates et heures de ces fichiers sont répertoriées en temps universel coordonné (UTC). Lorsque vous affichez les informations de fichier, elles sont converties en heure locale. Pour trouver la différence entre l’UTC et l’heure locale, utilisez l’onglet fuseau horaire dans l’élément de Date et heure dans le panneau de configuration.
Nom de fichierVersion de fichierTaille du fichierDateHeurePlateforme
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.40821,0 54,52019-Mar-200905:13x64
Link.exe9.0.30729.4082799, 03219-Mar-200905:13x86

Solution de contournement


Pour contourner ce problème, ajoutez un ou plusieurs membres factice « unsigned char » pour augmenter la taille de la structure ou de la classe pour le plus petit multiple de 8 octets. Par exemple, étendre les octets 14 à 16 octets.

État


Microsoft a confirmé l'existence de ce problème dans les produits Microsoft répertoriés dans la section « S'applique à ».

Plus d'informations


Pour plus d'informations sur la terminologie de mise à jour logicielle, cliquez sur le numéro ci-dessous pour afficher l'article correspondant dans la Base de connaissances Microsoft :
Description 824684 terminologie standard utilisée pour décrire les mises à jour logicielles de Microsoft

Procédure pour reproduire le problème

  1. Créez une application nommée Test.cpp en utilisant le code suivant dans 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. Compilez l’application à l’aide de la commande suivante :
    CL test.cpp/O2 /MD
Le résultat attendu est 4. Toutefois, le résultat est 0.