Немного про undefined behavior
Jun. 9th, 2011 07:07 pm
extern int a,b;
void f(void) {
a = (a++) % b;
}
При входных значениях a=19, b=5 значение a в результате:
gcc3.4, tcc, clang2.9, SunC++, C#: 4
gcc4.*: 20
SunC, IntelC 10.1: 5
судя по задумке автора, должно было получиться 5. Хотя это зависит от конкретного применённого психоактивного вещества...
(Оригинал - ныне удалённый драйвер в staging linux)
no subject
Date: 2011-06-09 04:22 pm (UTC)no subject
Date: 2011-06-09 04:45 pm (UTC)Разве по стандарту не должно сначала полностью вычисляться значение правой части присваивания, а потом выполняться собственно присваивание? То есть, разве результаты, отличные от 4, не являются багами?
no subject
Date: 2011-06-09 06:18 pm (UTC)no subject
Date: 2011-06-09 06:01 pm (UTC)1. Читаем значение a в R0.
2. Читаем значение b в R1.
3. Вычисляем остаток R0 % R1 и записываем в a.
4. Инкрементируем R0 и записываем в a.
Да, присваивание не создаёт sequence point (в новом стандарте этого термина нет, не знаю, что вместо него). Это естественно, если вспомнить распространённость и идиоматичность выражений вроде
while(*p++=*q++);.no subject
Date: 2011-06-09 07:58 pm (UTC)no subject
Date: 2011-06-09 08:33 pm (UTC)no subject
Date: 2011-06-09 10:28 pm (UTC)no subject
Date: 2011-06-10 03:19 am (UTC)а что тут такого undefined - все вроде корректно написано в коде
no subject
Date: 2011-06-10 07:12 am (UTC)no subject
Date: 2011-06-10 07:19 am (UTC)no subject
Date: 2011-06-10 08:05 am (UTC)no subject
Date: 2011-06-10 06:16 am (UTC)