warning: operation on ‘i’ may be undefined в избранное  новое горячее всё    подписка   модер. 
От: wils0nwww.atzone.org
Дата: 27.05.08 14:34
Доброго времени суток!

У меня простой вопрос. Есть код (см. ниже). Компилятор выдаёт warning: operation on ‘i’ may be undefined. Почему?
Компилятор gcc version 4.1.2 20070925 (Red Hat 4.1.2-33)
Спасибо.

void zcopy_z(const long a[], long  b[]) 
{ 
    register long i = a[0];
    while (a[i] == 0 && i>0) i--; 
    b[0] = i;  
    while (i>0) b[i]=a[i--];
}
gcc 4.2
Re: warning: operation on ‘i’ may be undefined в избранное  новое    модер. 
От: Аноним 446 
Дата: 27.05.08 14:43
Здравствуйте, wils0n, Вы писали:

W>Доброго времени суток!


W>У меня простой вопрос. Есть код (см. ниже). Компилятор выдаёт warning: operation on ‘i’ may be undefined. Почему?

W>Компилятор gcc version 4.1.2 20070925 (Red Hat 4.1.2-33)
W>Спасибо.

W>
W>void zcopy_z(const long a[], long  b[]) 
W>{ 
W>    register long i = a[0];
W>    while (a[i] == 0 && i>0) i--; 
W>    b[0] = i;  
W>    while (i>0) b[i]=a[i--];
W>} 
W>



А если массив а[] не будет содержать НИ ОДНОГО элемента ?
Re[2]: warning: operation on ‘i’ may be undefined в избранное  новое    модер. 
От: wils0nwww.atzone.org
Дата: 27.05.08 14:52
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, wils0n, Вы писали:


W>>Доброго времени суток!


W>>У меня простой вопрос. Есть код (см. ниже). Компилятор выдаёт warning: operation on ‘i’ may be undefined. Почему?

W>>Компилятор gcc version 4.1.2 20070925 (Red Hat 4.1.2-33)
W>>Спасибо.

W>>
W>>void zcopy_z(const long a[], long  b[]) 
W>>{ 
W>>    register long i = a[0];
W>>    while (a[i] == 0 && i>0) i--; 
W>>    b[0] = i;  
W>>    while (i>0) b[i]=a[i--];
W>>} 
W>>



А>А если массив а[] не будет содержать НИ ОДНОГО элемента ?


Забыл сказать, warning выдаётся на втором while.

2Аноним: думаю тогда б warning был в каждой строке
gcc 4.2
Re[3]: warning: operation on ‘i’ may be undefined в избранное  новое    модер. 
От: Roman Odaisky 
Дата: 27.05.08 15:00
Оценка:1 (1)
Здравствуйте, wils0n, Вы писали:

W>>> while (i>0) b[i]=a[i--];

W>Забыл сказать, warning выдаётся на втором while.

Это вежливый пинок под зад на тему того, что while нужно писать на отдельной строке! Теперь нам (в первую очередь тебе) еще разбираться, к чему именно относится предупреждение.

Впрочем, и без того всё ясно. У тебя должны выполниться вот какие операции:

1. Определить адрес исходного элемента;
2. Определить адрес конечного элемента;
3. Уменьшить i;
4. Скопировать.

Вопрос в пунктах 2 и 3. Как по-твоему, какой из них должен выполниться первым?
status=sent (delivered to file: /dev/null)
Re: warning: operation on ‘i’ may be undefined в избранное  новое    модер. 
От: EyeOfHelleyeofhell.habr.ru
Дата: 27.05.08 15:01
Оценка:3 (1) +1

while (i>0) b[i]=a[i--];


предупреждение о том, что в зависимости от версии и настроек компилятора b[i] может получить i как до --, так и после. Лекарство:

for( ; i > 0; i -- )
{
  b[ i ] = a[ i ];
}
Re[4]: warning: operation on ‘i’ may be undefined в избранное  новое    модер. 
От: wils0nwww.atzone.org
Дата: 27.05.08 15:09
Здравствуйте, Roman Odaisky, Вы писали:

RO>Здравствуйте, wils0n, Вы писали:


W>>>> while (i>0) b[i]=a[i--];

W>>Забыл сказать, warning выдаётся на втором while.

RO>Это вежливый пинок под зад на тему того, что while нужно писать на отдельной строке! Теперь нам (в первую очередь тебе) еще разбираться, к чему именно относится предупреждение.


RO>Впрочем, и без того всё ясно. У тебя должны выполниться вот какие операции:


RO>1. Определить адрес исходного элемента;

RO>2. Определить адрес конечного элемента;
RO>3. Уменьшить i;
RO>4. Скопировать.

RO>Вопрос в пунктах 2 и 3. Как по-твоему, какой из них должен выполниться первым?


Полагаю 2. Но учитывая пост EyeOfHell походу невсегда.
gcc 4.2
Re: warning: operation on ‘i’ may be undefined в избранное  новое    модер. 
От: Кодт модератор 
Дата: 27.05.08 15:29
Оценка:1 (1)
Здравствуйте, wils0n, Вы писали:

W>У меня простой вопрос. Есть код (см. ниже). Компилятор выдаёт warning: operation on ‘i’ may be undefined. Почему?

А на какой строчке он выдаёт этот варнинг, слабо было посмотреть?

W>
W>    while (i>0) b[ i ]=a[ i-- ];
W>

Жирным выделено UB.
Неупорядоченное чтение и модификация одной переменной, не разделённые точкой следования.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!