Опция GCC - O2 - ломает эту маленькую программу, или у меня неопределенное поведение [duplicate]

На этот вопрос уже есть ответ:

Уменьшение указателя вне границ; увеличивая его в пределы [дубликата] 3 ответа Почему арифметическое поведение указателя вне пределов не определено? 7 ответов

Я нашел эту проблему в очень большом приложении, сделал SSCCE из него. Я не знаю, имеет ли код неопределенное поведение или-O2 ломает это.

При компиляции с помощьюgcc a.c -o a.exe -O2 -Wall -Wextra -Werror печатает5.

Но это печатает 25 при компиляции без-O2 (например,-O1) или раскомментируйте одну из двух закомментированных строк (не вставляйте в строку).

#include <stdio.h>
#include <stdlib.h>
// __attribute__((noinline)) 
int f(int* todos, int input) {
    int* cur = todos-1; // fixes the ++ at the beginning of the loop
    int result = input;
    while(1) {
        cur++;
        int ch = *cur;
        // printf("(%i)\n", ch);
        switch(ch) {
            case 0:;
                goto end;
            case 1:;
                result = result*result;
            break;
        }
    }
    end:
    return result;
}
int main() {
    int todos[] = { 1, 0}; // 1:square, 0:end
    int input = 5;
    int result = f(todos, input);
    printf("=%i\n", result);
    printf("end\n");
    return 0;
}

Опция GCC-O2 ломать эту маленькую программу или у меня где-то неопределенное поведение?

Ответы на вопрос(2)

Ваш ответ на вопрос