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 :
http://support.microsoft.com/contactus/?ws=supportRemarque 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 fichier |
Version de fichier |
Taille du fichier |
Date |
Heure |
Plateforme |
---|---|---|---|---|---|
C2.dll |
15.0.30729. 4082 |
2,283,320 |
19-Mar-2009 |
05:13 |
x86 |
C2.dll |
15.0.30729.4082 |
2,36 1,656 |
19-Mar-2009 |
05:13 |
x86 |
C2.dll |
15.0.30729.4082 |
7,528 3,01 |
19-Mar-2009 |
05:13 |
x64 |
Link.exe |
9.0.30729.4082 |
1,0 54,520 |
19-Mar-2009 |
05:13 |
x64 |
Link.exe |
9.0.30729.4082 |
799, 032 |
19-Mar-2009 |
05:13 |
x86 |
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
-
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;
} -
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.