2016-11-30 6 views
0

Выполнение следующего кода выполняется до "!!!" когда оптимизатор компилятора оптимизирован:Сумасшедшее поведение при использовании оптимизации компилятора

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

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

Компилятор: IAR Studio C компилятор; Платформа: микроконтроллер SAM4C; оптимизация среднего уровня

Конечно, это уже код, в котором исходная проблема была сварена.

Я не могу понять, что компилятор делает здесь ...

С другой стороны, это работает, как ожидалось:

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

Выглядит загадочно, есть ли какие-либо подсказки в asm? – harold

ответ

0

я провел еще некоторое время, и заметил, что функция действительно возвращает 1, хотя отладчик останавливается в строке с «return 0;».

Проблема, с которой я столкнулся, скорее связана с неинициализированной переменной (вне функции), которая автоматически не устанавливается на ноль во время оптимизации.

Помимо странного поведения в отладчике, функция верна. К сожалению, наблюдение привело к неверному истолкованию.

 Смежные вопросы

  • Нет связанных вопросов^_^