컴파일 시간에서의 assert() 구현

일반적으로 우리가 사용하는 assert()는 runtime에서 사용할 수 있다.
UPX 소스를 분석하던 중 독특한 define이 눈에 들어왔는데 그것은..

COMPILE_TIME_ASSERT(sizeof(pe_header_t) == 248)


와 같은 구문이었다.

딱 봤을때 신기하다는 생각이 들지 않는가?
compile하는 시점에서 assertion을 수행한다는 것 자체가 신기할 따름이었다.
그래서 그 define부분을 보고 분석 한 결과..

#define COMPILE_ASSERT(x)        switch(0) case 1: case !(x): break;
#define COMPILE_ASSERT2(x)        typedef int __acc_cta_t[1-!(x)];


와 같은 define문을 간추려 내었다.
(UPX에서는 각 컴파일러의 버전에 맞게 되어 있지만 여기서는 생략한다)
즉, x를 조건식으로 본 뒤 switch에서 동일한 값의 case가 있을때 오류나는 원리를 이용하여 조건을 검사하는 것이다.

두번째는, 배열의 첨자는 0이 될 수 없다는 오류 메시지를 출력하는 컴파일러를 위해 있는 구문이며, 배열의 크기가 1-!(x), 즉 참일 경우에는 1-0 이 되지만 거짓일 경우에는 1-1이 되서, 결국 배열의 첨자가 0이라는 오류를 출력하게 하는 구문이다.
참고로 typedef는 여러번 겹쳐도 되기 때문에 문제가 되질 않는다.

크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 장현준

2007/06/19 21:24 2007/06/19 21:24
, , ,
Response
No Trackback , No Comment
RSS :
http://b4you.net/blog/rss/response/106

학생 관리 프로그램

학부 시절 만든 프로그램이다.

후배가 만들어달라고 해서 만들어준거 같은데 (기억이 가물가물)

지금 보니 코드가 "생각보다" 깔끔하다.

내가 옛날에 저런걸 만들었었다니..ㄷㄷㄷ

else if와 주석 다는 스타일이 좀 달라지긴 했다.

view..

크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 장현준

2007/05/03 23:09 2007/05/03 23:09
, ,
Response
A trackback , No Comment
RSS :
http://b4you.net/blog/rss/response/90

do같이 쓰기.

후배가 물어보길래 갑자기 생각나서 적어본다.

#include 

#define DO_INIT() int _do
#define DO(condition) for(_do = 0; (_do == 0) || (condition); _do = 1)

int main()
{
int b;

DO_INIT();

b = 990;

DO(b < 10)
{
printf("%d", b);

b++;
}

return 0;
}


또는

#include 

#define DO for(;;) \
{
#define WHILE(condition) if(!(condition)) \
{ \
break; \
} \
}

int main()
{
int b;

b = 990;

DO
{
printf("%d", b);

b++;
} WHILE(b < 10);

return 0;
}


사실 본질적으로는 많이 다르다.. 눈속임이겠지..;; ㄷㄷ
크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 장현준

2007/04/16 10:47 2007/04/16 10:47
, ,
Response
A trackback , No Comment
RSS :
http://b4you.net/blog/rss/response/86

구조체 사용 방법

Linux 커널을 분석하던 중 이상한 구문을 발견하였다. 무슨 구문이냐 하면..

#include <stdio.h>

struct temp
{
	char *name;
};

struct temp iam =
{
	name: "장현준", // <== 이부분
};

int main()
{ 
	printf("%s", iam.name);

	return 0;
}


와 같이 위에서 주석으로 표시된 부분이다.
이런 구문은 처음 봐서.. 뭘까? 했는데.. "gcc에서만 지원"하는 문법이었다.(vs에서는 안된다)
멤버 변수를 간단히 초기화 시킬때 저런 식으로 초기화를 시킬 수 있는것 같은데,
표준는 아닌거 같지만.. gcc에서 지원이 되니 다음부터 linux쪽 개발할 때 효율적으로 표시하려면 저런식으로 짜는것도 나쁘진 않을 것 같다.
크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 장현준

2007/04/09 13:34 2007/04/09 13:34
, , ,
Response
No Trackback , No Comment
RSS :
http://b4you.net/blog/rss/response/84


블로그 이미지

빗소리를 먹는 사람.

- 장현준

Notices

Archives

Authors

  1. 장현준

Recent Trackbacks

Calendar

«   2017/09   »
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

Site Stats

Total hits:
1714555
Today:
3710
Yesterday:
3980