본문

문자열을 사용할 떄 주의해야 할 사항(형식 지정자를 사용해야 할 경우)

format string is not a string literal(potentially insecure)
format not a string literal and no format arguments 

두가지 에러가 발생하는 경우가 있다. 아래와 같은 코드를 실행시킨다고 해보자.
NSLog([NSString stringWithFormat:@"%@ %@, %@", errorMsgFormat, error, [error userInfo]]); 
NSLog는 format specifier가 없는 경우 하나의 인자를 받을 수 있다. 위의 예가 그런것인데 결국 하나의 NSString객체가 NSLog에 전달되는 형태이다. 이는 컴파일러에서 경고만 주고 실행은 잘 되지만 보안상에 문제가 있다. 우선 이 코드는 다음과 같이 바뀌어야 한다,.
NSLog(errorMsgFormat, error, [error userInfo]);
 
그럼 보안상의 문제는 어떨 때 발생할까? 다음과 같은 코드를 생각해보자.

NSString *nameFormat = @"%@ %@";
NSString *firstName = @"Jon";
NSString *lastName = @"Hess %@";
NSString *name = [NSString stringWithFormat:nameFormat, firstName, lastName];
NSLog(name); 

이렇게 되면 마지막의 NSLog는 다음과 같이 수행될것이다
NSLog(@"Jon Hess %@");

이는 %@에 의해서 하나의 또다른 문자열 인수를 찾게 될 것이다. 하지만 실제로는 존재하지 않기 때문에, 마치 C에서 하듯이 스택에서 랜덤한 포인터값을 가져와서 NSString이라고 생각하는 결과를 초래하게 될것이며 이는 프로그램의 비정상 실행을 유도한다. 물론 %@라는 문자열을 사용하는 일이 적기 떄문에 단지 하나의 인자를 사용하는 출력도 사용 가능하겠지만 만약이라는 경우도 고려할 때, format specifier를 반드시 사용해야 한다. 이를 고려해야 할 함수로는 printf, scanf, NSLog, [NSString stringWithFormat]등이 있다.

원문출처 ; http://stackoverflow.com/questions/1677824/snowleopard-xcode-warning-format-not-a-string-literal-and-no-format-arguments 

댓글

Holic Spirit :: Tistory Edition

design by tokiidesu. powerd by kakao.