[CODE]char ch; while( (ch = fgetc( f )) != EOF ) { printf("%c", ch ); }[/CODE]

언뜻보기에는 맞는 것 같이 보인다. 하지만, 여기에는 isprint 못지 않은 두려운 버그가 숨어 있다.

fgetc 의 원형은 다음과 같다.

[CODE]int fgetc( FILE * );[/CODE]

fgetc의 return 값이 int 란다. 그리고, 문자하나를 되돌리는 함수라니..

각설하고 위 코드는 다음과 같아야한다.

[CODE]int ch; while( (ch = fgetc( f )) != EOF ) { printf("%c", (char) ch ); }[/CODE]

fgetc의 설명을 보면, 파일의 끝이나 오류를 만났을 때 EOF를 되돌린단다. unsigned char 로 표현할 수 있는 문자의 범위를 벗어나는 값으로 EOF가 정의되어 있지 않는한 파일에서 EOF와 동일한 문자값을 읽었을 때 이것이 파일의 끝이 아님에도 불구하고 끝으로 해석하는 버그가 좋아하는 상황이 벌어지게 될 것이다.

처음 코드에서는 강제로 char 변수에 받았으니, 문자 중에 어떤 값은 EOF로 해석되는 경우도 생기는 것은 당연하고, 따라서, fgetc의 리턴값은 파일에서 한 문자를 읽는것에만 흥분한 나머지, 오류 리턴을 제대로 판단하지 못하게 되는 것이다.
따라서, EOF인지 확인한다음 char로 캐스팅하여야 정상적인 사용법이 되는 것이다.

실제 EOF는 많은 구현에서 -1 로 정의되어 있다.
char ch = 'X';

위와 같이 되어 있을 때, 다음과 같이 사용하는 것이 옳은 것이냐하는 것인데,

if( isprint( ch ) )
{
blah;
}

경고감이다. 왜냐하면, isprint의 원형은

[CODE]int isprint (int c);[/CODE]

이기 때문이며, 여기에는 isprint에 넣는 인자의 철학과 우리가 흔히 사용하는 문자형 변수의 차이에서 오는 괴리감이 있는 것이다.

int 는 char가 표현할 수 있는 것보다. 일반적으로 더 많은 범위를 받을 수 있는데 (sizeof( char ) == sizeof( int ) 인 구조를 제외하면 항상 그렇지 않는가?) 그러면서도 signed 형이라는 것이다. 그런데, char 는 명시적으로 signed char, unsigned char이라 쓰지 않는한 컴파일러의 디폴트 값을 따른다.
그 디폴트 값이 signed라면, 위 코드는 부호확장이라는 개념으로 캐스팅이 일어날 것이다. 일반적으로 문자 코드 값은 음수가 없는데도 char 만 사용함으로 signed char로 취급되고, 이는 unsigned char 로 표현할 수 있는 0~255까지의 코드를 -128~127로 해석하여 isprint 함수에 전달하게 될 것이다. 이는 개발자의 뇌리 속에서 원하지 않았을테고, isprint도 사실 원하지 않을지 모른다.

컴파일러에 따라 이러한 char에서 int로의 암시적 캐스팅을 경고하는 경우도 있으므로 참고하시되, 유독 short 에서 int 로의 확장은 아무 문제가 없는데, char 에서 int 는 한 번쯤 생각해보아야한다.

따라서, isprint 같이 int로 문자를 받아서 평가하는 함수와 어울리는 곳에서는 unsigned char 로 받아서 처리하는 센스도 필요하다.
김준동이...

갑자기 오늘 그대가 그립네그려...
이유야 있겠지만, 그냥 보고 싶구랴...
  1. june8th 2005.03.11 00:19 신고

    혹시 캐비넷을 열었다 그것을 봤나보군요.

  2. 2005.03.16 16:29 신고

    안보았는데....

남자인 관계로, 화장실에 들어가면 몇초간 면벽 수도를 하게 된다.
회사 건물 화장실은 약간 살구색이 들어간 대리석에 검은 점박이가 있는데,
오늘은 그곳에서 부부와 자식으로 되어 있는 세 명의 가족을 보았다.

내 눈이 본 것일까, 대리석이 보여 준 것일까.
건물은 나보다 먼저 있었고, 나도 온지 오래되었는데,
왜 오늘에야 보인 것일까.
BOOKS in YES24
http://www.yes24.com/home/mylist/listView.asp?ListMeta=186836

READING LIGHT
http://www.funshop.co.kr/vs/detail.aspx?no=2116159000

한나의 기도는 성경에서 가장 유명한 여인의 두 기도 중의 하나이다.
누가복음의 마리아의 기도와 한나의 기도가 그것인데, 오늘은 한나의 배경에 대해 잠시 묵상할 기회가 있었다.

한나는 그 라이벌인 남편의 둘째 부인 브닌나로부터 일방적으로 공격당하는 유약한 성품의 소유자인듯하다. 성경에는 둘째 부인이 몇명의 자식과 몇 년동안 한나를 괴롭혀 왔는지는 나와있지 않지만, 상당히 괴롭힘을 오랜시간동안 당한 듯하다.

심지어 남편인 엘가나는 그런 한나가 왜 그렇게 괴로운 상황인지 잘 모르는, 상황파악 잘 못하는 사람이다. 하나님은 한나가 기도하기 전까지 자식을 못낳도록 막으셨으며, 그녀가 괴로워 자식을 갖게 해달라는 기도를 하게 하신다.

자식을 못낳게 막으시고, 기도하게 하시는 하나님.
하나님의 계획속에 태어나는 한나, 엘가나의 아들 사무엘.


아내와 집에서 성경공부를 한다는 것은 참 즐거운 일이다.
딸래미가 쉬지 않고 쫑알대는 어려움이 있기는 하지만,
공감할 수 있고, 생각을 나눌 수 있고, 주위 상황에 견주어
대화도 가능하고, 더욱 좋은 것은 요즘 침체되어 있는
내 생활에 활력도 가져다 주고...

같이 할 수 있는 이런 아내가 있어서 좋다.
정재훈씨의 tattertools를 설치하고, 몇개의 스킨을 설치하여 이것저것 써보다 CUFMC.COM에서 만든 간단한 것으로 만족할 만한 블로그를 열었다.

다들 시작한 웹로깅(블로깅)이지만, 내가 이제와서 시작하게 된 계기는 그간 사용해온 위키의 싫증과 모종의 정제된 온라인 출판물을 남기고 싶어서이다. 일단, 이렇게 마음이라도 먹고 시작하는 것이 유행에 민감한 양 시작하는 것보다는 나으리라 생각하여 열고는 있지만 계속 잘 될지는 두고 볼일이다.

그간 써온 UseModWiki 기반의 gypark 수정버전도 나름, 위키가 활성화되고 난 다음 편승한 상황이었는데, 그이후로도 글쓰기가 반짝하고 지난 2년간 뜸했던것으로보아 이후 2년도 뻔해 보이긴 하다마는 알량해도 어쩌겠냐 이것이지.

웹상의 글은 짧게 써야 읽는 다는 이상한 규칙(?)에 의하여 여기까지를 웹로깅 프롤로그라 하련다.
* GNU GCC versus Sun's Compiler in the SPARC Platform
::http://www.osnews.com/story.php?news_id=5830&page=3
* Are 64-bit Binaries Really Slower than 32-bit Binaries?
::http://www.osnews.com/story.php?news_id=5768
* Solaris 64-bit Developer's Guide
::http://docs.sun.com/app/docs/doc/806-0477
* Compiler Usage Guidelines for 64-Bit Operating Systems on AMD64 Platforms
::http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/32035.pdf
* Intel 386 and AMD x86-64 Options
::http://gcc.gnu.org/onlinedocs/gcc-3.4.3/gcc/i386-and-x86_002d64-Options.html
* Porting InteㅣApplications to 64 bit Linux on POWER
::http://www-1.ibm.com/servers/enable/linux/pdfs/intel_ppc64.pdf
* AIX 5L Porting Guide
::http://publib-b.boulder.ibm.com/Redbooks.nsf/RedbookAbstracts/sg246034.html?Open
* Large File Support in Linux
::http://www.suse.de/~aj/linux_lfs.html
* Porting x86 Linux device drivers to AMD64 Technology
::http://www.amd.com/us-en/assets/content_type/DownloadableAssets/Porting_x86_Linux_device_drivers_to_AMD64_Technology.htm
* Proceedings of the GCC Developers Summit: Porting to 64-bit Linux systems
::http://zenii.linux.org.uk/~ajh/gcc/gccsummit-2003-proceedings.pdf

  1. 함수의 프로토타입을 꼼꼼히 분석하라 : 함수의 프로토타입에는 그 함수가 뭘하는 것인지에 대한 정보의 90%가 들어 있다.
  2. const 형식이 어떤 것인지 모두 이해하고 있어라 : 함수 인자, 변수 선언, 멤버 함수 맨 뒤.
  3. static 형식이 어떤 것인지 모두 이해하고 있어라 : 변수 선언, 함수 선언, 멤버 함수
  4. 오브젝트 파일안에 뭐가 들어 있는지 알고 있어야한다. : nm, objdump, readelf, dumpbin.exe, depends.exe 등의 유틸리티가 도움이 된다.
  5. 소스를 코딩하고나면 오브젝트 코드가 어떻게 생기는지 알고 있어야한다.
  6. 스택에 쌓이는 순서를 상상하라
  7. 커널레벨과 사용자레벨의 차이와 그 전환은 어떻게 일어나는지 알고 있어야한다.
  8. 디버깅 툴(브레이크 포인트, 변수 내용 보기, 시스템 콜 트레이싱)의 작동원리를 알고 있어라.
  9. 환경변수가 어떻게 저장되는지 알고 있어라.
  10. fork에서 유지되는 것과 유지되지 않는 것에 대해 알고 있어라.
  11. callback 함수의 개념에 대해 알고 있어라
  12. -fPIC로 주어지는 relocatable object의 원리에 대해 알고 있어라
  13. 호출 스택에 대한 구조를 알고 있어라
  1. Delight 2005.06.21 12:32 신고

    좋은글 많이 보고 가요

  2. doodoo 2006.04.12 02:47 신고

    9번 글은 제가 항상 궁금하던 것인데...어디서 좀 찿을길이 없을까요? 무슨 글자를 넣어서 검색을 해보라는 둥...그런거...

    • 주인 2006.04.12 03:34 신고

      hex dump를 만들어서 argv 가 가리키는 곳부터 1kB 정도를 출력해보세요.

      어디서 찾긴 힘들것 같습니다.

    • 최호진 2006.04.12 11:08 신고

      bss code stack env
      위 단어를 모두 넣어 검색해보세요.

바퀴를 다시 발명하면 안되나?

다시 발명하지 말아야할 이유는 전임자의 노력을 조사하지 않고 무모하게 뛰어드는 것을 막기위해서 이겠지만,
우리는 바퀴에 대해서 곰곰히 생각해볼 몇가지 이유가 있다.

바퀴란 다음과 같은 조건을 만족하는 것이이라.

# 널리 쓰이고 있다.
# 척보면 그 원리가 뻔해서 비밀이 없다. (타이어의 복잡함을 말하는 것이 아니라, 표면이 원이라는 얘기)
# 조금 어렵다 싶은 것도, 상당히 많은 문서를 뒤져서 찾아낼 수 있다.

위와 같은 조건을 만족하지 않으면, 다시 발명해도 좋으리라. 이 글을 쓰는 것도 누군가 비슷한 글을 썼을 것임에도 불구하고, 다시 쓰는 이유를 바퀴 발명에 비유할 수 있을 것이라는 생각을 해보면서, 이 글은 3번에 대한 게으름 때문에 쓰는 것이다.

위와 같은 세가지 조건이 있음에도 불구하고 바퀴를 새로이 발명할 필요가 있다. 왜냐고?
바퀴를 한 번이라도 만들어본 사람과 만들지 않고 학습한 사람에게서의 차이는 명품에 대한 가치를 아느냐 모르느냐의 차이가 있는 것이다. 물론 명품의 가치는 많은 것을 보아온 사람도 알 수 있지만, 만들어서 아는 것과 보기만 해서 아는 가치를 어떻게 비교할 수 있을까. 마치 전문 축구 해설위원인 신문선과 선수 및 감독출신으로서의 차범근 해설위원의 차이를 생각하면 알 수 있지 않을까?

바퀴를 다시 발명하지 말라는 말에 모든 것을 포기하려는 생각일랑 당장 접어치우고, 오늘부터 바퀴가 다시 발명될 때까지 멈추지 말자.
  1. 2005.03.06 02:32 신고

    아직 오픈하기전에 주신 Carmel 님의 코멘트는 지웠습니다.. 쏘리.. :)

+ Recent posts