Можно ли превратить "-Wwrite-strings" в ошибку?
Я проверял это на GCC 4.8.3, 4.9.2 и транке 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 ответ
Я видел удаленный ответ, но потерпите меня... он был действительно правильным (по крайней мере, при моем тестировании). Я думаю, что то, что вы нашли, интересно и близко к ошибке.
Что касается моего тестирования (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
в командной строке, чтобы, если вы допустили ошибку и / или предполагаемая ошибка компилятора была исправлена, то вы можете заставить все это работать так, как вы действительно хотели).