2017-05-08 4 views
0

내가 코드를 다음 있습니다 :C - 비 일정한 형식 문자열 플래그

if (my_condition_is_true){ 
    my_format_string = "Something %d, plus some_other_thing %lu" 
} 
else{ 
    my_format_string = "Something %d, plus some_other_thing %llu" 
} 

my_string_formatter(my_format_string, var1, var2) 

이 일정하지 않은 포맷 스트링 문제가 발생합니다. 나는

my_string_formatter("%s" my_format_string, var1, var2) 

을 다음 시도하지만,이 도움이 doesnot

어떤 생각의 사람들 ....

+3

'my_string_formatter'는 무엇입니까? – StoryTeller

+6

var2는 unsigned long과 unsigned long long 모두 어떻게됩니까? 당신이 [mcve]없이 답을 얻을 지 확신하지 못합니다. –

+0

경고입니다. 자신이하는 일을 안다면 경고를 무시하는 것이 최선의 선택 일 수 있습니다 (모두 해제 할 수 있음). – pmg

답변

0

가 아닌 일정한 '형식'문자열이 전달되고 있습니다

"Something %d, plus some_other_thing %lu" 

부터 here :

printf와 같은 함수에 상수가 아닌 'format'문자열을 건네면 은 형식으로 정의 된 인수의 수와 함수에 실제로 전달 된 인수의 수 사이의 불일치를 초래할 수 있습니다. 형식 문자열이 궁극적으로 신뢰할 수없는 출처에있는 경우이 을 악용 할 수 있습니다.

이것은 보안에 대한 경고입니다.

char* someString = someFunc(); 
printf(someString); 

는 일반적인 오류가 초보자의 사이에 특히 때문에

+0

링크를 제공해 주셔서 감사 드리며, 이미이 사이트를 살펴 보았습니다. 문제는 어떻게 해결해야합니까? – Emdadul

+0

@ Emdadul이 gcc 플래그에 익숙하지 않은 사용자를 위해이 정보를 포함시키는 것이 유용 할 것입니다 –

0

그것은 경고입니다. 문자열에 형식 지정자 또는 이스케이프 처리되지 않은 백분율 기호가 포함되어 있으면 꽤 나쁜 버그입니다. 운이 좋으면 세분화 잘못입니다. 그렇지 않으면 보안 허점입니다.

실제로 무엇을하고 있는지 알면 경고를 비활성화 할 수 있습니다. (NB 제 컴파일러 (clang)가 -Wall이라도이 경고를 발생시키지 않습니다. 다소 놀랍습니다). 이 답변은 첫 번째 문자열이 형식 문자열입니다 컴파일러를 알려줍니다 당신의 my_string_formatter 기능에 속성을 추가

https://stackoverflow.com/a/12171222/169346

도움이 될 수 있습니다. 이 속성은 컴파일러간에 이식성이 없을 가능성이 높습니다.

그러나 두 개의 형식 문자열은 두 번째 매개 변수에 대해 다른 유형 (하나는 unsigned long이고 다른 하나는 unsigned long long)이지만 어떤 형식 문자열이 사용 되든 상관없이 두 개의 매개 변수를 호출에 전달합니다. 이것은 버그이며 구현시에 longlong long이 같은 크기이기 때문에 문제가 해결되지 않습니다.