Когда агрессивная оптимизация цикла видит следующий код ...
int i;
i=0;
while(i<5) {
printf("%d\t", a[i]);
i+=2;
}
... он собирается использовать технику, называемую "развертывание цикла", чтобы переписать это следующим образом ...
printf("%d\t", a[0]);
printf("%d\t", a[2]);
printf("%d\t", a[4]);
Проблема! Итерации 0 и 1 хороши, но итерация 2 будет выполнять доступ к массиву за пределами границ, вызывая неопределенное поведение. Вот почему вы получили предупреждение, которое вы сделали.
Объявление i
значением volatile
не позволяет компилятору выполнить эту оптимизацию (поскольку он не может быть уверен, что другой процесс не изменяет значение i
во время выполнения цикла), поэтому он должен выйти код, как это было. У вас все еще есть неопределенное поведение, просто компилятор не предупреждает вас об этом. В общем, ужасное «исправление» от вашего коллеги.