我在GCC 4.8.3,4.9.2和trunk 20141210上进行了测试。使用-Werror=write-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";
我有什么遗漏或者这只是一个缺失的功能吗?
答案 0 :(得分:1)
我已经看到了删除的答案,但请耐心等待......这实际上是正确的(至少在我的测试中)。我认为您发现的内容很有趣,而且几乎就是一个错误。
就我的测试而言(GCC 4.9.1建立在Mac OS X 10.9.4 Mavericks上,在Mac OS X 10.10.2 Yosemite上运行),似乎-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命令:
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
,那么您可能需要使用-Werror -Wwrite-strings
进行试用版本,但由于其他问题会导致失败,但这样做会还可以识别可写字符串问题,您可以修复并检查这些问题。然后,如果您对-Wwrite-strings
错误感到满意,则可以在编译中返回不包括-Werror
(在命令中保留-Wwrite-strings
甚至-Werror=write-strings
如果你犯了一个错误和/或修正了推定的编译器错误,那么你就可以按照你真正想要的方式工作了。