2015-02-07 3 views
1

GCC 4.8.3, 4.9.2 및 트렁크 20141210에서 이것을 테스트했습니다. -Werror=write-strings을 사용하면 경고가 올바르게 설정되지만 오류가되지는 않습니다. 그러나"-Wwrite-strings"를 오류로 변환 할 수 있습니까?

g++ -std=c99 -x c -Werror=write-strings -O2 -Wall -pedantic main.cpp 
warning: initialization discards 'const' qualifier from pointer target type 

    char *s = "test"; 

, 그것은 C++ 모드에서 오류로 바뀝니다 : 내가 사용 명령 줄은

g++ -Werror=write-strings -O2 -Wall -pedantic -pthread main.cpp 
main.cpp:8:15: error: deprecated conversion from string constant to 'char*' 
    [-Werror=write-strings] 

    char *s = "test"; 

는 내가 부족 뭔가가 있나요 또는이 단지 누락 된 기능은 무엇입니까?

답변

1

나는 삭제 된 답변을 보았지만 나와 함께 견뎌 냈다 ... 실제로는 (적어도 내 테스트에서는) 정확했다. 나는 당신이 발견 한 것이 흥미롭고 버그에 가까울 것이라고 생각합니다.

내 테스트 (Mac OS X 10.10.2 Yosemite에서 실행되는 Mac OS X 10.9.4 Mavericks에서 빌드 된 GCC 4.9.1)까지는 -Werror=write-strings이 경고 메시지를 표시하지 않습니다 GCC 팀이 다른 견해를 가지고 있음을 알 수 있지만 아마 버그라고 생각합니다). -Werror이 적용될 때만 오류가 발생합니다. 여러분의 편의를 위해

$ cat x.c 
#include <stdio.h> 

int main(void) 
{ 
    char *test = "data"; 
    printf("%s\n", test); 
    return 0; 
} 
$ gcc -O3 -g -std=c11 -c x.c 
$ gcc -O3 -g -std=c11 -c x.c -Wwrite-strings 
x.c: In function ‘main’: 
x.c:5:18: warning: initialization discards ‘const’ qualifier from pointer target type 
    char *test = "data"; 
       ^
$ gcc -O3 -g -std=c11 -c x.c -Werror=write-strings 
x.c: In function ‘main’: 
x.c:5:18: warning: initialization discards ‘const’ qualifier from pointer target type 
    char *test = "data"; 
       ^
$ gcc -O3 -g -std=c11 -c x.c -Werror -Wwrite-strings 
x.c: In function ‘main’: 
x.c:5:18: error: initialization discards ‘const’ qualifier from pointer target type [-Werror] 
    char *test = "data"; 
       ^
cc1: all warnings being treated as errors 
$ gcc -O3 -g -std=c11 -c x.c -Wall -Wextra -Werror=write-strings 
x.c: In function ‘main’: 
x.c:5:18: warning: initialization discards ‘const’ qualifier from pointer target type 
    char *test = "data"; 
       ^
$ gcc -O3 -g -std=c11 -c x.c -Wall -Wextra -Werror 
$ gcc -O3 -g -std=c11 -c x.c -Wall -Wextra -Werror -Wwrite-strings 
x.c: In function ‘main’: 
x.c:5:18: error: initialization discards ‘const’ qualifier from pointer target type [-Werror] 
    char *test = "data"; 
       ^
cc1: all warnings being treated as errors 
$ gcc -O3 -g -std=c11 -c x.c -Wall -Wextra -Werror -Werror=write-strings 
x.c: In function ‘main’: 
x.c:5:18: error: initialization discards ‘const’ qualifier from pointer target type [-Werror] 
    char *test = "data"; 
       ^
cc1: all warnings being treated as errors 
$ 

, 쉽게 볼 수 있도록,이는 GCC의 I 실행 한 명령입니다 :

가 여기에 내가 도망 무엇 일반적 -Werror 실행할 수없는 경우

gcc -O3 -g -std=c11 -c x.c 
gcc -O3 -g -std=c11 -c x.c -Wwrite-strings 
gcc -O3 -g -std=c11 -c x.c -Werror=write-strings 
gcc -O3 -g -std=c11 -c x.c -Werror -Wwrite-strings 
gcc -O3 -g -std=c11 -c x.c -Wall -Wextra -Werror=write-strings 
gcc -O3 -g -std=c11 -c x.c -Wall -Wextra -Werror 
gcc -O3 -g -std=c11 -c x.c -Wall -Wextra -Werror -Wwrite-strings 
gcc -O3 -g -std=c11 -c x.c -Wall -Wextra -Werror -Werror=write-strings 

는, 다른 문제로 인해 실패 할 -Werror -Wwrite-strings으로 시험판 빌드를해야 할 수도 있지만 수정하고 확인할 수있는 쓰기 가능한 문자열 문제를 식별합니다. 그런 다음 -Wwrite-strings 오류를 확인하면 컴파일시 또는 심지어 -Werror=write-strings을 유지하면서 실수로 실수를하거나 예상되는 컴파일러 버그가 수정되도록 명령 줄에서 -Werror을 제외하고 다시 돌아갈 수 있습니다. 그 때 당신은 당신이 정말로 원했던 방식으로 모든 것을 작동시킬 수 있습니다).

+0

gcc의 bugzilla 계정 생성이 닫힙니다. 나에게 버그 리포트를 제출할 수 있습니까? (필요한 경우) –

+0

버그 질라 (bugzilla)를 검색하여 이전에보고 된 증거가 있는지 확인할 수 있습니까? 기본적으로'-Wwrite-strings' 또는'-Werror = write-strings'을 찾아보고이 버그와 관련된 버그가보고 된 것을 볼 수 있습니까? 관련성이있는 항목을 찾을 수 없다면 내 자격 증명을 파고 버그를 만듭니다. 소스가 나쁘지는 않습니다 (그러나 그들이 요청한 전처리 된 소스는 커질 것입니다; 나는 심지어 ''을 필요로하지 않는 repro를 생성해야하며, 그 라인을'extern void function (const char * str);로 대체하고 (printf() 대신에) –

+0

필자가 발견 한 것은 [this] (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=35648)인데, 주석 기자 중 한 명이' -Werror = write-strings'는 트릭을 수행해야하며, 사람들이 사용하는 결과를 보여주는 수많은 검색 결과가 있습니다. –