是否可以转动" -Wwrite-strings"成错误?

时间:2015-02-07 01:15:37

标签: gcc gcc-warning

我在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";

我有什么遗漏或者这只是一个缺失的功能吗?

1 个答案:

答案 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如果你犯了一个错误和/或修正了推定的编译器错误,那么你就可以按照你真正想要的方式工作了。

相关问题