2016-11-30 2 views
0

Die Ausführung des folgenden Codes läuft auf "!!!" Wenn der Compiler optimiert ist:Verrücktes Verhalten bei Verwendung der Compiler-Optimierung

int test() 
{ 
    volatile uint32_t flag = 0; /* volatile doesnt matter */ 

    flag = 3; 
    if (flag == 0) 
    { 
     return 0; // !!! 
    } 
    else 
    { 
     return 1; 
    } 
} 

Compiler: IAR Studio C-Compiler; Plattform: SAM4C Mikrocontroller; Mittlere Ebene Optimierung

Natürlich ist dies bereits ein Code, wo das ursprüngliche Problem eingekocht wurde.

Ich kann nicht verstehen, was der Compiler hier ...

Auf der anderen Seite tut, funktioniert das wie erwartet:

int test() 
{ 
    volatile uint32_t flag = 0; /* volatile doesnt matter */ 
    int result = 0; 

    flag = 3; 
    if (flag == 0) 
    { 
     result = 0; 
    } 
    else 
    { 
     result = 1; // !!! 
    } 
    return result; 
} 
+0

Sieht geheimnisvoll aus, gibt es Hinweise in der ASM? – harold

Antwort

0

Ich verbrachte etwas mehr Zeit und beobachtet, dass die Funktion in der Tat zurückkehrt 1, obwohl der Debugger bei der Zeile mit "return 0;" stoppt.

Das Problem, auf das ich stieß, war eher eine nicht initialisierte Variable (außerhalb der Funktion), die während der Optimierung nicht automatisch auf Null gesetzt wurde.

Abgesehen von dem seltsamen Verhalten im Debugger ist die Funktion korrekt. Leider führte die Beobachtung zu einer Fehlinterpretation.

Verwandte Themen