으악~ 도와주세요..제발... 가변인자와 관련한 문제입니다.
으악..미치기 일보직전이네요..
RVDS2.2 를쓰고 있습니다.
test란 함수에서 다음의 함수를 다음과 같이 호출합니다.
(여기서 tmpItemAvailSize 는 long long type으로 64bit 변수는 8byte alignment를 쓰고있습니다.)
AcSprintfS( szText, sizeof(szText), "%llu", tmpItemAvailSize );
AcSprintfS함수는 다음과같이 재정의 되어있습니다.
#define AcSprintfS(buffer,bufferSize, ...) AcSprintfSEx(buffer, bufferSize, __FILE__, __LINE__, __VA_ARGS__)
이때.. 제가 궁금한것은 stack에 가변인자 들이 저장될때..
즉 "%llu" 의 주소와 tmpItemAvailSize 값이 저장될때..
꼭.. "%llu"와 tmpItemAvailSize 사이에 꼭(tmpItemAvailSize이 64bit 변수일경우) 4byte 빈공간이 생겨서 AcSprintfSEx 함수에서 처리하기가 힘들다는 것입니다.
즉..------ 스택에 다음과 같이 저장됩니다.-------
("%llu" 의 주소가 0x88001000 이라고 가정, tmpItemAvailSize는 0x00000000000000DF)
0x88001000 0x00000000 0x000000DF 0x00000000
이런식으로 저장되서 AcSprintfSEx 함수에서는 이를 처리하기 힘듭니다.
( 즉 tmpItemAvailSize를 0x000000DF00000000 으로 읽게 됩니다.)
(AcSprintfSEx 함수에서는 가변인자중 "%llu" 부분만 끌어내고 나머지는 그대로 가변인자 포인터 형태로
vsnpritnf 를 호출합니다.)
왜 4byte gap 이 생길까요 ㅠㅠ
64bit 변수를 짝수번째
64bit 변수를 짝수번째 아규먼트로 넘겨보세요.
(0번째 또는 2번째 또는 4번째 등등)
이렇게 해서 증상이 없어진다면 툴체인 버그.
OTL
va_list는 사용하고 계신 거죠?
man va_arg
va_list를 사용하면서도 그런 문제가 발생한다면 윗분 말씀처럼 툴체인 버그이고, 그렇지 않고 수동으로 스택 주소를 더해가고 있다면 그건 잘못 짠 겁니다. (그런 식으로 짜면 절대 나중에 제대로 돌아간다는 걸 보장할 수 없습니다.)
ㅠㅠ
안녕하세요
일단 답글 감사드립니다..
짝수번째 아규먼트로 가도 마찬가지 입니다.
ㅠㅠ 툴체인버그는 아닌듯...
그리고 스택주소를 수동으로 더해가고 있지는 않습니다..
ㅠㅠ 왜그럴까요
증상이 없어졌다면
증상이 없어졌다면 툴체인의 '어설픈' 버그고,
증상이 그대로라면 툴체인의 '완벽한' 버그거나 va arg 를 잘못 사용하고 계시는 겁니다.
OTL
소스를 좀...
AcSprintfSEx 함수에서 vsnprintf 호출하는 코드를 보여주시면 더 많은 분들이 도와주실 수 있을 것 같네요.
...그나저나 함수 이름 좋군요. :P
질문하고 상관없는 답변인데...
일단 질문하신 내용은 AcSprintfSEx()를 보기전에는 뭐라고 말씀드릴수 없겠고
제가 글을쓴건
#define AcSprintfS(buffer,bufferSize, ...) AcSprintfSEx(buffer, bufferSize, __FILE__, __LINE__, __VA_ARGS__)
의 경우 __FILE__, __LINE__ 의 의미가 없지 않나요?
제가 개발하는 환경(VS2008) 의 경우 #define 문의 __FILE__, __LINE__ 이 적용되서 다른 방법을 썼었습니다.
자세히 보면 좀 특이하긴 하네요.
#define 절에서 ... 도 사용가능한가봐요?
AcSprintfSEx() 함수의
AcSprintfSEx() 함수의 원형이 AcSprintfSEx(char *buf, size_t buf_len, char *file, int line, ...)
일것 같은데 이것을 아래와 같이 바꿔 보세요.
AcSprintfSEx(char *buf, size_t buf_len, char *file, int line, char *fmt, ...)
---------
간디가 말한 우리를 파괴시키는 7가지 요소
첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스
이익추구를 위해서라면..
다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치
---------
간디가 말한 우리를 파괴시키는 7가지 요소
첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스
이익추구를 위해서라면..
다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치
댓글 달기