programing

gcc-Wall이 0-length 형식 문자열에 대한 경고를 주는 이유는 무엇입니까?

newstyles 2023. 11. 5. 11:04

gcc-Wall이 0-length 형식 문자열에 대한 경고를 주는 이유는 무엇입니까?

이것에 대한 정보를 찾기 위해 주변을 조금 찾아봤지만 만족스러운 것이 발견되지 않았습니다.함수 호출에 특별한 동작이 있습니까?

sprintf(someString, "");

그게 왜 경고인지 설명해주는거죠?나는 C 표준이 0 길이의 포맷 문자열을 허용한다는 것을 발견했을 뿐입니다.

나는 다음 예시를 시도했습니다.

#include <stdio.h>

int main()
{
    char str[2] = {'a', 'a'};
    sprintf(str, "");
    printf("\'%c\'\'%c\'\n", str[0], str[1]);
    return 0;
}

출력물을 출력합니다.

'''a'

내가 기대했던 바로 그것입니다.그럼 왜 경고를 하는 거지?

GCC가 경고를 발행한다는 사실은 일반적으로 구성이 합법적인 C인지 여부와는 무관하지만, GCC 개발자들이 사용자가 작성한 내용이 아닌 다른 의미를 의미하는 것으로 간주하는지 또는 단지 잘못된 스타일이라고 간주하는지 여부와 무관합니다.다음은 몇 가지 예입니다.

  • if (x = 0)— 당신의 말은 거의 확실했습니다.if (x == 0).
  • printf(str)— 당신은 거의 확실하게 둘 중 하나를 의미했습니다.fputs(str, stdout)아니면printf("%s", str); 쓰여진대로라면, 그 코드는 매우 위험합니다.
  • if (foo == bar & MASK)— 당신의 말은 거의 확실했습니다.if (foo == (bar & MASK)).

기타.

당신의 경우, GCC는 당신이 왜 전화를 하는지에 대해 의문을 품고 있다고 생각합니다.sprintf(String, "")와 동등한 일을 하다String[0]=0;(후자가 훨씬 짧고 빠르며 명확합니다.)

경고를 받는 이유는 gcc가 두번째 주장을 알고 있기 때문입니다.sprintf()일반적으로 다양한 형식 사양을 가진 문자열이 비어 있지 않아야 합니다. 코드에서 수행 중인 문자열에 대해 기능적으로 동등하고 "더 합법적인" 호출을 수행하는 것입니다.sprintf(str, "%s", ""). 또한 포맷 사양을 충족시키기에 충분한 N개의 추가 인수가 거의 항상 존재합니다.여기서 사용하다 보니까 일종의.strcpy(), 이것은 기술적으로 유효하지만 표준 라이브러리를 사용하는 매우 이상한 방법입니다.

GCC의 경고일 뿐입니다.응용프로그램의 한 부분에 대해 이를 억제하려면 다음 작업을 수행할 수 있습니다.

#pragma GCC diagnostic ignored "-Wformat-zero-length"
int main()
{
     // code that produces a warning
}
#pragma GCC diagnostic warning "-Wformat-zero-length"

언급URL : https://stackoverflow.com/questions/9926674/why-does-gcc-wall-give-warning-about-zero-length-format-string