2017-09-11 8 views
5

나는 다음과 같은 코드가 있습니다 :GCC는 STR에 NULL이 될 수 없습니다 불평

int atoi(const char * str) 
{ 
    int ret = 0, i; 
    if (str) { 
      for (i = 0; str[i] != '\0'; i++) 
        if (str[i] >= '0' && str[i] <= '9') 
          ret = ret * 10 + str[i] - '0'; 
    } 
    return ret; 
} 

[email protected] ~/p/book> make 
gcc -c -o db.o db.c -Wall -Werror -std=c99 -g -DVERSION=\"v0.4\" -Wno- 
unused-variable -Wno-unused-function 
gcc -c -o misc.o misc.c -Wall -Werror -std=c99 -g -DVERSION=\"v0.4\" - 
Wno-unused-variable -Wno-unused-function 
misc.c: In function ‘atoi’: 
misc.c:55:5: error: nonnull argument ‘str’ compared to NULL [-Werror=nonnull-compare] 
    if (str) { 
    ^
cc1: all warnings being treated as errors 
Makefile:54: recipe for target 'misc.o' failed 
make: *** [misc.o] Error 1 

나는 GCC 버전을 사용하고 그것을 컴파일하려고 :

[email protected] ~/p/book> gcc --version 
gcc (Debian 6.3.0-18) 6.3.0 20170516 

경고를 이해하지 못합니다. const char *는 NULL이 될 수 있어야합니다. 맞습니까?

+2

귀하의 문제와 관련이 없지만 귀하의 기능에 심각한 결함이 있습니다. ''123abc456 ''을 입력하고 결과가 어떻게되는지 봅니다. –

+0

아마도'gcc'는 그 함수를 인라인하려고 시도하고 NULL 인자가 전달되지 않았 음을 알고 있습니다. 이 함수가 코드에서 사용 된 횟수와 사용 예제는 무엇입니까? – myaut

+1

거짓 긍정처럼 보입니다. 'if (str)'이'if (str! = NULL)'과 비교하여 엉성한 스타일이긴하지만 실제로는 경고를 던질 필요가 없습니다. – Lundin

답변

17

atoi은 c 라이브러리의 표준 함수입니다. 해당 표준 함수의 헤더에는 특수한 gcc 처리를 트리거하는 __nonnull 속성이 포함되어 있습니다.

재정의 된 구현에서는 인수가 null이 아니라는 가정을 준수하여 특수 처리를 사용하지 않으므로 경고가 표시됩니다.

실제 답변 : 표준 라이브러리의 함수에서 함수 이름을 다시 사용하지 마십시오.

+1

gcc 6.1.2에서 OP 문제를 재현 할 수 없지만 그럼에도 불구하고 매우 좋은 대답입니다 (10k에 대해 축하합니다)! –

+0

동일하지만 stdlib.h를 포함 할 때조차 이것을 재현 할 수 없습니다. – Lundin

+0

OP 코드를 붙이고 * #를 추가하여 '#include '을 재현 할 수 있습니다. 이것은 glibc 함수의'__nonnull' 속성을 가져 오는 것입니다. 그것 없이는 문제 없습니다. – Peter