의미
매크로를 복수 구문으로 사용할 때는 "\" 문자를 이용해서 작성할 수 있다.
#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
'C, C++ > 전처리기' 카테고리의 다른 글
[CERT C/전처리기] (2) 인클루전 가드 미처리의 취약성 (0) | 2021.01.21 |
---|---|
[CERT C/전처리기] (1) 매크로 함수의 취약성 (0) | 2021.01.21 |
[CERT C] 전처리기 (0) | 2021.01.21 |