R6002 floating point not loaded ???

2006.05.16 02:08

단장 조회 수:973 추천:15

float a;
scanf( "%f", &a );


위의 코드를 일부 M$ 컴파일러에서 돌려보면 의외로 이런 에러가 발생한다.




문제의 그분..



imays 님의 포스팅 을 통해서 이미 알고 있던 문제였던지라 상콤하게 volatile a = 1.0f; 를 붙여놓고 안심하고 있었는데 뭔가 난리가 났던것 같다. 해서 오늘 웹질을 해서 알아낸 것을 정리해 본다.

1. scanf() / printf() 계열에서 사용되는 부동 소수점 포멧 문자열("%f") 해석기는 코드 량이 꽤나 크다. 해서 M$ 컴파일러들은 불필요한 경우 최종 실행 이미지에 해당 라이브러리를 포함하지 않는다.

2. 저 라이브러리가 필요한지 아닌지는 일단 컴파일러가 판단한다. 그런데 컴파일러가 저걸 어떻게 판단하는지에 대한 정보는 MSDN 에서도 저마다 얘기가 다르다. 어떤 문서에서는 프로그램 아무데서나 float 변수에 대입만 하면 된다고 하고 ( perform a floating-point assignment elsewhere in the program ), 또 어떤 문서에서는 반드시 포멧 스트링안에 있는 변수에 대입을 하라고 되어 있기도 하다. ( you must specify a floating-point value or a pointer to a floating-point value in the argument list. ) 같은 회사의 문서들이 저마다 다 딴소리를 하고 있으니 이건 경험으로 유추해 내는수밖에는 없겠다. 테스트를 좀보았는데, 최소한 한개의 소스파일에서 float 변수의 대입과 scanf() /printf() 패밀리의 호출이 동시에 일어나야 하는 것 같다. 말하자면 a.cpp 에서 대입하고 b.cpp 에서 호출하면 말짱 꽝이라는 얘기. 그런데 이것은 테스트로 얻어낸 결론이니 역시 믿을만한건 못된다.

3. 조금 더 파고들어가 보자. 부동 소수점 라이브러리 판단은 컴파일러가 하게 되지만 실제로 최종 이미지를 만드는 것은 링커의 몫이다. 그렇다면 컴파일러는 어떤 방식으로 링커에게 라이브러리 사용 여부를 전달하는 것일까? CRT 소스코드를 뒤적거리다 알아낸 바에 따르면, 컴파일러는 해당 정보를 _fltused 에 대한 레퍼런스를 만든다. 그리고 링커는 object 파일들 중에 최소한 한개라도 _fltused 변수 를 참조하면, 부동소수점 라이브러리를 최종 이미지에 링크시킨다.

4. 해서 아래의 코드를 코드 아무데다 쑤셔넣으면 R6002 문제는 사라진다. _fltused 의 인스턴스가 없어도 M$ 링커님이 알아서 잘~ 처리해 주신다.


extern "C" {
extern int _fltused;
volatile int _AVOID_FLOATING_POINT_LIBRARY_BUG = _fltused;
};

사족. 분명히 어딘가에 제시가 되어있을것 같아서 MSDN 을 뒤졌더니 .Net 포팅 관련 해서도 비슷한 문제가 있는듯 하다. 거기서 M$ 가 공식적으로 제시하는 해결책은 _fltused 에 1을 대입하는 것이더군. (그런데 왜 그짓을 해야하는지에 대한건 한마디도 안써놨다. -_- )

댓글 0

파일 첨부

여기에 파일을 끌어 놓거나 파일 첨부 버튼을 클릭하세요.

파일 크기 제한 : 0MB (허용 확장자 : *.*)

0개 첨부 됨 ( / )
 
목록
번호 제목 글쓴이 날짜 조회 수
24 [공지] 게시판 용도 김도완 2005.06.16 1178
23 네크로노미콘 단장 2006.10.27 1234
22 형법총론 핵심정리 단장 2006.04.19 1246
21 [C++] extern C에 대해 단장 2007.05.01 1256
20 Stream of Life 단장 2009.06.29 1285
19 NAT 홀펀칭 단장 2007.10.25 1294
18 [C++]function objects 단장 2007.05.01 1341
17 한국운전면허를 일본운전면허로 바꾸기 [2] 단장 2007.10.26 1351
16 이스람(Islam:회교:回敎)에서의 성 단장 2007.02.08 1379
15 제트 추력 엔진 단장 2008.04.29 1600
14 Nat기반 P2P 프로그래밍 단장 2007.11.21 1627
13 자동차 정비용어 정리 단장 2007.01.20 1660
12 골프의 물리학 단장 2009.05.30 1681
11 std::tr1 단장 2008.03.13 1848
10 Fast Bit Counting 단장 2009.02.21 1883
9 Large Address Aware file 단장 2014.03.05 1948
8 술의 이력서 단장 2007.02.09 2270
7 vTune 사용법 단장 2009.01.13 3234
6 효율적인 동기화를 위한 아이디어 하나 단장 2007.09.29 3284
5 버텍스버퍼의 효율적인 사용 단장 2007.10.01 5100