으악~ 도와주세요..제발... 가변인자와 관련한 문제입니다.

woosik1의 이미지

으악..미치기 일보직전이네요..
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 이 생길까요 ㅠㅠ

bushi의 이미지

64bit 변수를 짝수번째 아규먼트로 넘겨보세요.
(0번째 또는 2번째 또는 4번째 등등)

이렇게 해서 증상이 없어진다면 툴체인 버그.

OTL

jick의 이미지

man va_arg

va_list를 사용하면서도 그런 문제가 발생한다면 윗분 말씀처럼 툴체인 버그이고, 그렇지 않고 수동으로 스택 주소를 더해가고 있다면 그건 잘못 짠 겁니다. (그런 식으로 짜면 절대 나중에 제대로 돌아간다는 걸 보장할 수 없습니다.)

woosik1의 이미지

안녕하세요
일단 답글 감사드립니다..
짝수번째 아규먼트로 가도 마찬가지 입니다.
ㅠㅠ 툴체인버그는 아닌듯...
그리고 스택주소를 수동으로 더해가고 있지는 않습니다..
ㅠㅠ 왜그럴까요

bushi의 이미지

증상이 없어졌다면 툴체인의 '어설픈' 버그고,
증상이 그대로라면 툴체인의 '완벽한' 버그거나 va arg 를 잘못 사용하고 계시는 겁니다.

OTL

jick의 이미지

AcSprintfSEx 함수에서 vsnprintf 호출하는 코드를 보여주시면 더 많은 분들이 도와주실 수 있을 것 같네요.

...그나저나 함수 이름 좋군요. :P

simpid의 이미지

일단 질문하신 내용은 AcSprintfSEx()를 보기전에는 뭐라고 말씀드릴수 없겠고

제가 글을쓴건

#define AcSprintfS(buffer,bufferSize, ...) AcSprintfSEx(buffer, bufferSize, __FILE__, __LINE__, __VA_ARGS__)

의 경우 __FILE__, __LINE__ 의 의미가 없지 않나요?
제가 개발하는 환경(VS2008) 의 경우 #define 문의 __FILE__, __LINE__ 이 적용되서 다른 방법을 썼었습니다.
자세히 보면 좀 특이하긴 하네요.
#define 절에서 ... 도 사용가능한가봐요?

IsExist의 이미지

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가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.