KORRIGERA: Felaktig maskinkod genereras för en "switch"-sats i Visual C++ 2010 x 64-kompilatorn

Artikelöversättning Artikelöversättning
Artikel-id: 2802711 - Visa produkter som artikeln gäller.
Visa alla | Dölj alla

På den här sidan

Symptom

Anta att du kompilerar en C eller C++ kod källfil till en binär fil för x 64-baserade med Visual C/C++-kompilatorn (Cl.exe) i Microsoft Visual Studio 2010. Källkodsfilen innehåller en funktion som använder ett uttryck för växlar . I den här situationen genereras felaktiga maskinkod för växlar uttryck om följande villkor är uppfyllda:
  • /Ob1 (Only_inline)-kompilatoralternativet är aktiverat.
  • Den /O1 (minimera storlek), /O2 (maximera hastighet), /Ox (Full optimering) eller /Og (Global optimeringar) optimeringsalternativ för kompilatorn är aktiverat.
  • /GL (hela programmet optimering) kompilatoralternativ är inaktiverad.

Lösning

Information om snabbkorrigeringen

En snabbkorrigering är nu tillgänglig från Microsoft. Den är avsedd att lösa det problem som beskrivs i denna artikel. Använd den bara på datorer där detta problem.

Lös problemet genom att kontakta Microsoft Support för att få snabbkorrigeringen. En fullständig lista över telefonnummer till Microsoft Customer Support Services och information om supportkostnader finns på följande Microsoft-webbplats:
http://support.microsoft.com/contactus/?ws=support
Obs! I särskilda fall avbrytas kan avgifter som normalt supportsamtal om en supporttekniker att en särskild uppdatering kan lösa ditt problem. De vanliga supportkostnaderna gäller för övriga supportfrågor och problem som inte uppfyller kraven för den aktuella uppdateringen.

Förutsättningar

Om du vill installera den här snabbkorrigeringen måste du ha Visual Studio 2010 Service Pack 1 (SP1) installerat.

Krav på omstart

Du behöver inte starta om datorn när du har installerat snabbkorrigeringen, om de berörda filerna inte används. Vi rekommenderar att du stänger Visual Studio 2010-relaterade komponenter innan du installerar den här snabbkorrigeringen.

Filinformation

Den globala versionen av den här snabbkorrigeringen har de filattribut (eller senare) som visas i följande tabell. Datum och tider för dessa filer anges i UTC-tid (UTC). När du visar filinformationen konverteras den till lokal tid. Om du vill se skillnaden mellan UTC-tid och lokal tid kan du använda den Tidszon fliken i den Datum och tid objekt på Kontrollpanelen.
Dölj bildenVisa bilden
assets folding start collapsed
Dölj tabellenVisa tabellen
FilnamnFilversionFilstorlekDatumTidPlattformSökväg
C2.dll16.0.40219.4442,606,71211-Mar-201319:24x 86Microsoft Visual Studio-10.0\VC\bin
C2.dll16.0.40219.4442,493,56012-Mar-201316:48x 86Microsoft Visual Studio-10.0\VC\bin\x86_amd64
C2.dll16.0.40219.4442,593,92812-Mar-201316:48x 86Microsoft Visual Studio-10.0\VC\bin\x86_ia64
C2.dll16.0.40219.4442,960,50412-Mar-201316:48x 64Microsoft Visual Studio-10.0\VC\bin\amd64
Dölj bildenVisa bilden
assets folding end collapsed

Mer Information

Om du vill återskapa problemet skapar du en C eller C++ källfilen som innehåller följande kod:

#include <stdio.h>

int test(int bps, int sflags)
{
    if (sflags & (1 << bps))
    {
        switch (bps)
        {
        case 1:  return 1;
        case 2:  return 3;
        default: return 0;
        }
    }
    else
    {
        switch (bps)
        {
        case 1:  return 2;
        default: return 0;
        }
    }
}
 
void main()
{
    int res = test(1, -1);
    printf("%d\n", res);
}


Öppna Visual Studio x 64 korsa kommandotolk eller Visual Studio x 64 Win64 kommandotolk i Visual Studio 2010 och kompilera källfilen med följande kommando:
cl /Ob1 /O2 'Källa sökväg'

Det förväntade resultatet är 1. Men är det faktiska resultatet 0.

Status

Microsoft har bekräftat att detta är ett problem i Microsoft-produkterna som nämns i avsnittet "Gäller".

Referenser

Mer information om /Ob kompilatoralternativ finns på följande MSDN-webbplats:
Allmän information om kompilatoralternativ /Ob
Mer information om /GL kompilatoralternativ finns på följande MSDN-webbplats:
Allmän information om kompilatoralternativ /GL
Mer information om optimeringsalternativ /O finns på följande MSDN-webbplats:
Allmän information om /O alternativ (optimera kod)

Egenskaper

Artikel-id: 2802711 - Senaste granskning: den 29 mars 2013 - Revision: 3.0
Informationen i denna artikel gäller:
  • Microsoft Visual Studio 2010 Service Pack 1
  • Microsoft Visual Studio 2010 Ultimate
  • Microsoft Visual Studio 2010 Professional
  • Microsoft Visual Studio 2010 Premium with MSDN
Nyckelord: 
kbqfe kbhotfixserver kbfix kbsurveynew kbexpertiseadvanced kbmt KB2802711 KbMtsv
Maskinöversatt
VIKTIGT: Denna artikel är översatt av Microsofts automatiska översättningsprogram och inte av en mänsklig översättare. För att Du skall ha åtkomst till alla artiklar i Knowledge Base på Ditt föredragna språk så är en del artiklar översatta av människor och en del artiklar av översättningsprogram. Tänk på att en artikel som är översatt av ett översättningsprogram inte alltid är perfekt. Artikeln kan innehålla fel ord, grammatik eller meningsbyggnad, ungefär som en utländsk talare kan göra misstag när han eller hon pratar med Dig på Ditt språk. Microsoft ansvarar inte för eventuella felaktigheter i översättningen, fel eller skador som orsakats av någon felöversättning av innehållet eller våra kunders användande av det översatta innehållet. Microsoft uppdaterar kontinuerligt mjukvaran för översättningsprogrammet.
Den engelska versionen av artikeln är följande: 2802711

Ge feedback

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com