C :: typedef으로 함수 포인터를...

2009/08/25 15:40

Dll Injection으로 Brute Force를 하려고 공부하던 차에 함수 포인터를 활용하는 방법을 알게 되었습니다. 일반적으로 C 언어는 절차 지향 언어, 함수 지향 언어라고 알려져 있어서 C++의 클래스 구현이 안 된다고 배웁니다만, 이 함수 포인터를 이용하면 충분히 클래스를 구현할 수 있을 것 같습니다. 실제로 커널 등의 여러 소프트웨어에서 이 방법을 쓰는 것 같구요.

함수 포인터를 선언하려면 우선 typedef으로 함수의 형태를 만들어줘야 합니다.

typedef int (*STRCMP)(char*, char*);


위 코드를 예로 들어보겠습니다. 이미 눈치 채셨겠지만, 이것은 strcmp() 함수의 포인터형을 정의하는 코드입니다. 먼저 typedef 다음에 나오는 int는 함수의 반환값을 의미합니다. 이것을 char*로 고치면 이 함수의 반환값은 char* 형이라는 것이겠죠? 그리고 (*STRCMP)가 함수 포인터입니다. 앞 쪽의 *를 보시면 감 잡으시겠죠? 마지막으로 뒷 쪽의 (char*, char*)는 함수에 들어갈 인자값입니다.

STRCMP my_strcmp = (STRCMP)strcmp;


함수 포인터를 정의하는 방법은 일반적으로 포인터를 정의하는 것과 같습니다. 함수 포인터형을 기술하고 뒤에는 함수의 이름을, 그런 다음에 캐스팅을 하여서 원래의 함수의 포인터를 넘기는 것이죠. 저기서 strcmp 대신 실제 메모리 주소를 적어도 똑같이 동작합니다. 원래는 메모리 주소를 적는 것이겠지만, 컴파일러에 의해서 맵핑되는 것이니까요.

실제 코드를 작성해볼까요?

#include <stdio.h>
#include <string.h>

typedef int (*STRCMP)(char*, char*);

int main (void)
{
STRCMP my_strcmp = (STRCMP)strcmp;
int value = my_strcmp ("a", "b");
printf ("return value: %d\n", value);
return 0;
}


이런 코드를 만들어 작성해보았습니다. 주의해야 할 점은 typedef로 정의되는 함수 포인터형의 형태와 실제 함수의 형태가 같아야 한다는 것입니다. 내부야 어떻게 되어있는지 몰라도, 반환값과 인자값은 형태가 같아야 정상적으로 동작하죠.

위 코드의 결과가 어떻게 나올까요? 컴파일러는 제대로 될까요? 결과는 제대로 나올까요? 아래를 조시면 모든 게 정상적으로 되는 것을 확인할 수 있습니다.

사용자 삽입 이미지

이로서 C로도 객체 지향적인 설계가 가능하겠죠?
크리에이티브 커먼즈 라이센스
Creative Commons License

6l4ck3y3 0x08 과거의 글모음/내 머리 속의 노트 , , , ,

Trackback Address:http://hisjournal.net/blog/trackback/262
  1. 2011/01/05 10:40
    알쏭달쏭한 typedef Tracked from 김재호의 디지털보단 아날로그
  1. 나같은 경우 typedef 쓰기엔 너무 귀찮은 관계로
    void (*func)(void);
    이런식으로 ㅎㅎㅎ ;; 머 결국 비슷한가 ;;

  2. Blog Icon
    6l4ck3y3

    똑같죠. 그냥 바로 포인터를 쓰면 워닝이 떠서요... 워닝이야 상관없긴 하지만... ^^;