본문 바로가기

CERT C/전처리기

[CERT C/전처리기] (3) 복수 구문의 매크로 취약성

의미

매크로를 복수 구문으로 사용할 때는 "\" 문자를 이용해서 작성할 수 있다.

#define SWAT(X,Y) \
	tmp = x; \
	x = y;	\
	y = tmp;

동작 방식

간단한 한 가지 구문보다 많은 구문을 매크로로 사용할 수 있다.

 

문제 코드 1. 헤더 파일에 항상 인클루전 가드를 둬라

출력을 예상해보기

#define SWAP(x,y) \
	tmp = x; \
	x = y;	\
	y = tmp;
    
    
    
int main()
{
    int x = 3, y = 3;
    
    if(x != 2) SWAP(x,y);

    return 0;
}

if 문에서 원하는 동작을 하지 않고 오류가 나게 됩니다.

 

취약점 분석 및 해결 코드 1

분석 : if 문에서 tmp = x; 구문만 실행이 되고 ( 물론, tmp에서 오류가 나게 됩니다. ) 나머지 두 줄은 if 문 밖에서 실행되게 된다.

 

해결 방법 : do ~ while 구문을 사용한다.

#define SWAP(x,y) \
do{\
	tmp = x; \
	x = y;	\
	y = tmp; \
} while(0)
    
    
    
int main()
{
    int x = 3, y = 3;
    
    if(x != 2) SWAP(x,y);

    return 0;
}

정상적인 동작을 하게 되는데 do ~ while 문에서 마지막에 세미콜론을 붙이지 않은 이유는 if문 SWAP 함수 호출 부분 뒤에 세미콜론을 붙였기 때문입니다. 

 

POINT

  • 매크로 복수 구문을 사용할 때는 do ~ while 구문을 사용하자

참조


PRE10-C. Wrap multistatement macros in a do-while loop

 

wiki.sei.cmu.edu/confluence/display/c/PRE00-C.+Prefer+inline+or+static+functions+to+function-like+macroswiki.sei.cmu.edu/confluence/display/c/PRE06-C.+Enclose+header+files+in+an+include+guardwiki.sei.cmu.edu/confluence/display/c/PRE10-C.+Wrap+multistatement+macros+in+a+do-while+loop