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

Другие вопросы по тегам