Баг в gcc? swap через ^=

yolki


#include <stdio.h>

#define swap(a,b) (a)^=(b)^=(a)^=(b)

int main()
{
int n1, n2;
int *p1, *p2;

p1=&n1;
p2=&n2;

n1=42;
n2=100500;

printf("%d %d\n",n1,n2); swap(n1,n2); printf("%d %d\n", n1,n2);
printf("%d %d\n",*p1,*p2); swap(*p1,*p2); printf("%d %d\n", *p1,*p2);

return 0;
}


42 100500
100500 42
100500 42
0 100500

хм.. с -O2 работает нормально
gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-4)
gcc (Gentoo 4.8.4 p1.0, pie-0.6.1) 4.8.4

yolki

ну, -O2 несчитово. он вычисляет на этапе компиляции
вот, здесь по честному:

#include <stdio.h>

#define swap(a,b) (a)^=(b)^=(a)^=(b)

int main()
{
int n1, n2;
int *p1, *p2;

p1=&n1;
p2=&n2;
scanf("%d%d",&n1,&n2);

printf("%d %d\n",*p1,*p2);
swap(*p1,*p2); printf("%d %d\n", *p1,*p2);

return 0;
}


...
movl 12(%rsp), %ecx
movl 8(%rsp), %edx
movl $.LC1, %esi
movl $1, %edi
xorl %eax, %eax
xorl %ecx, %edx
xorl %edx, %ecx
xorl %ecx, %edx
movl %ecx, 12(%rsp)
movl %edx, 8(%rsp)
call __printf_chk
...

tokuchu

А почему баг?

yolki

ты считаешь нолик там в результате - это норм?
я пока забил курить ассемблерный листинг, пошёл обедать ;)

SEKTORDIMA

Ошибка в программе: между точками следования переменная модифицируется более одного раза. Как следствие — неопределённое поведение.
http://stackoverflow.com/questions/9958514/sequence-point-xo...

yolki

А, ок.
Оставить комментарий
Имя или ник:
Комментарий: