'operation on 'variable' may be undefined'에 해당되는 글 1건

  1. 2010.04.22 변수인데 왜 operation on 'variable' may be undefined 야? (5)
Programming/C Win32 MFC2010.04.22 14:28

#include "stdio.h"

int main(int argc, char *argv[])
{
	int x = 1;
	printf("%d %d %d\n", ++x, x, x++);
	return 0;
}

You're running into two issues:

1. Undefined behavior -- you are attempting to modify the value of an
object more than once between sequence points, and the Standard imposes
no requirement on how to handle that behavior. Basically, any
expression of the forms:

i = i++;
j = k++ * k++;
foo(i,i++,--i);

invoke undefined behavior. Read up on the semantics of the "++" and
"--" operators in an *authoritative* reference (the Standard would
obviously be one, but also K&R2 or H&S5); they don't work the way most
people think they should.

2. Order of evaluation -- AFAIK, there's no requirement that
expressions in a function parameter list be evaluated in any particular
order. At first blush, it *looks* like the arguments were evaluated
from right to left (if x = 1, then x++ evaluates to 1, with the side
effect that x == 2, and ++x evaluates to 3, with the side effect that x
== 3), but given that you've invoked undefined behavior the actual
reason may be something else entirely.

[링크 : http://bytes.com/topic/c/answers/222558-operation-x-may-undefined]

위의 소스를 gcc -Wall 옵션을 주고 컴파일 할 경우에
$ gcc -Wall cc_test.c
cc_test.c: In function ‘main’:
cc_test.c:6: warning: operation on ‘x’ may be undefined
cc_test.c:6: warning: operation on ‘x’ may be undefined
이런 경고가 발생한다.

분명 x는 변수인데, 그에 대한 operation이 정의되지 않았다는게 무슨 말인지 모르겠지만,
아무튼 실행을 하면
$ ./a.out
3 3 1
요런 희한한 결과가 나온다.

아무튼, calling convention과도 연관이 있어 보이는데,
c언어 특성상 right-left 로 push 하므로(가장 위에는 왼쪽 값이 오도록)
가장 먼저들어가는, 오른쪽 x++ 은 1이 들어가고
1을 더해준다음, 다음 명령어를 수행하면서(++x) 한번에 2가 증가하게 되고
그럼으로 인해 x, ++x 순으로 3이 들어가는게 아닐까 생각된다.

아니면 말구?

[링크 : http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html]


winXP SP3 32bit / VC++ 6 에서 해본 결과
 2 1 1

disassemble


linux / gcc 결과
 3 3 1

disassemble


objdump를 소스와 함께 디스어셈블 하기 위해서는
gcc -g 옵션으로 디버깅 정보를 주어야 한다.
[링크 : http://wikidocs.net/mybook/1473]


솔찍히 어셈을 몰라서 모르겠다 ㅋㅋ
결론 : 한줄에 ++나 -- 연산자를 중복으로 사용하지 말자.
Posted by 구차니

댓글을 달아 주세요

  1. 표준에 ++, -- 연산자를 한 명령문 안에 여러 번 쓰면 undefined라고 나올 거라는 예상입니다.

    2010.04.30 00:11 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 물론 그런것도 있지만, 컴파일러에 따라 값이 다르게 나오는게 신기해서 말이죠 ㅎ

      2010.04.25 19:43 신고 [ ADDR : EDIT/ DEL ]
    • 하나의 컴파일러에서 release냐 debug냐로 결과가 갈리기도 하는걸요...
      (블루앤라이브 님의 int >>32...)

      2010.04.25 20:34 신고 [ ADDR : EDIT/ DEL ]
    • 그게 사실이라면 디버그 모드의 디버그 문들이 문제인거겠죠. 타입문제라던가. 머.. 결론은 MS 제품이라고 해서 일방적으로 믿지 말자란거죠? ^^

      2010.04.25 21:58 신고 [ ADDR : EDIT/ DEL ]
    • MS든 뭐든 일단 커다랗고 아름다운 프로그램은 못 믿을 구석이 있는 것 같아요 ^^ (어라?)

      2010.04.30 00:11 신고 [ ADDR : EDIT/ DEL ]