Sintomi
Si consideri il seguente scenario.
-
Si crea un'applicazione che carica un byte da una struttura o da una classe in Microsoft Visual Studio 2008 Service Pack 1 (SP1).
-
Attivare l'opzione di ottimizzazione /Ox o l'opzione di ottimizzazione /O2 .
-
Compilare l'applicazione utilizzando una configurazione di rilascio per la x64 piattaforma.
In questo scenario, l'offset che viene generato per accedere al membro della struttura o il membro della classe non è corretto.
Questo problema si verifica solo quando la dimensione della struttura e l'offset o la dimensione di classe e l'offset è uguale a una delle seguenti coppie:-
(14,13)
-
(15,13)
-
(22,21)
-
(23,21)
-
(30,29)
-
(31,29)
Risoluzione
Informazioni sull'hotfix
Un hotfix supportato è ora disponibile da Microsoft. Tuttavia è destinato esclusivamente alla risoluzione del problema descritto in questo articolo. Applicarlo solo ai sistemi in cui si verificano questo problema specifico. Questo hotfix potrebbe essere sottoposto ad ulteriori test. Pertanto, se il problema non causa gravi difficoltà, consiglia di attendere la versione successiva del Service pack di Visual Studio 2008 contenente tale hotfix.
Per risolvere immediatamente questo problema, contattare il supporto tecnico clienti Microsoft per ottenere l'hotfix. Per un elenco completo dei numeri di telefono supporto tecnico clienti Microsoft e informazioni sui costi dell'assistenza, visitare il seguente sito Web Microsoft:http://support.microsoft.com/contactus/?ws=supportNota: In casi particolari, le spese normalmente addebitate per le chiamate di supporto potrebbero essere annullate qualora un addetto al supporto Microsoft determina che uno specifico aggiornamento risolverà il problema. I costi di supporto normale verranno applicati per eventuali ulteriori domande e problemi che non dovessero rientrare nello specifico aggiornamento in questione.
Prerequisiti
È necessario disporre di Visual Studio 2008 Service Pack 1 per applicare questo hotfix.
Richiesta di riavvio
Non è necessario riavviare il computer dopo avere applicato questo hotfix.
Informazioni sulla sostituzione dell'aggiornamento rapido
Questo hotfix non sostituisce eventuali altri aggiornamenti rapidi.
Informazioni sui file
La versione inglese di questo hotfix presenta gli attributi di file (o attributi successivi) elencati nella tabella riportata di seguito. Le date e ore dei file sono elencate in base al formato UTC (Coordinated Universal Time Coordinated). Quando si visualizzano le informazioni sul file, viene convertito in ora locale. Per calcolare la differenza tra ora UTC e ora locale, utilizzare la scheda fuso orario nell'elemento di Data e ora nel Pannello di controllo.
Nome del file |
Versione del file |
Dimensione del file |
Data |
Ora |
Piattaforma |
---|---|---|---|---|---|
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 |
3,01 7,528 |
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 |
Soluzione alternativa
Per risolvere questo problema, aggiungere uno o più membri fittizio "unsigned char" per estendere la dimensione della struttura o della classe al multiplo più piccolo di otto byte. Ad esempio, estendere 14 byte a 16 byte.
Stato
Microsoft ha confermato che questo è un problema dei prodotti Microsoft elencati nella sezione "Si applica a".
Ulteriori informazioni
Per ulteriori informazioni sulla terminologia degli aggiornamenti software, fare clic sul seguente numero di articolo per visualizzare l'articolo della Microsoft Knowledge Base:
824684 descrizione della terminologia standard utilizzata per descrivere gli aggiornamenti software Microsoft
Procedura per riprodurre il problema
-
Creare un'applicazione denominata test. cpp utilizzando il seguente codice in 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; } -
Compilare l'applicazione utilizzando il comando seguente:
test. cpp CL /O2 /MD
Il risultato previsto è 4. Tuttavia, il risultato effettivo è 0.