LINUX.ORG.RU

Какая версия gcc даст предупреждение на данный код?


0

1
size_t var = 0;
scanf("%d", &var)

Т.е. должно быть предупреждение, что %d не хорошо использовать для size_t. Но gcc 4.6 или gcc 4.8.1 не хотят давать предупреждение. Компилирую подобным образом

1) gcc-4.8 -Wall -Werror /home/max/workspace/project/project.c -o project -std=c99

2) gcc-4.8 -Wall -Werror /home/max/workspace/project/project.c -o project


gcc -Wall -Werror 1.c 
1.c: В функции <<main>>:
1.c:4:3: ошибка: format <<%d>> expects argument of type <<int *>>, but argument 2 has type <<size_t *>> [-Werror=format]
1.c:5:3: ошибка: format <<%d>> expects argument of type <<int>>, but argument 2 has type <<size_t>> [-Werror=format]
1.c:6:1: ошибка: control reaches end of non-void function [-Werror=return-type]
cc1: all warnings being treated as errors

cat 1.c 
#include <stdio.h>
int main(int argc, char **argv){
  size_t var = 0;
  scanf("%d", &var);
  printf("Entered: %d\n", var);
}


gcc --version
gcc (GCC) 4.7.2

Eddy_Em ☆☆☆☆☆
()

Компилируй с -Wall -Wextra --pedantic

$ gcc -Wall -Wextra --pedantic -c 1.c 
1.c: В функции «f»:
1.c:5:5: предупреждение: format «%d» expects argument of type «int *», but argument 2 has type «size_t *» [-Wformat=]
     scanf("%d", v);
     ^
$ gcc --version
gcc (GCC) 4.8.2 20140206 (prerelease)
anonymous
()
Ответ на: комментарий от Eddy_Em
/tmp $ gcc -Wall 1.c
1.c:3:6: warning: return type of ‘main’ is not ‘int’ [-Wmain]
 void main(void)
      ^
1.c: In function ‘main’:
1.c:6:3: warning: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘size_t *’ [-Wformat=]
   scanf("%d", &var);
   ^
/tmp $ gcc --version
gcc (Gentoo 4.8.2 p1.3r1, pie-0.5.8r1) 4.8.2
wakuwaku ★★★★
()
Ответ на: комментарий от Eddy_Em
gcc -Wall -Werror test.c
test.c: В функции «main»:
test.c:4:3: ошибка: format «%d» expects argument of type «int *», but argument 2 has type «size_t *» [-Werror=format=]
   scanf("%d", &var);
   ^
test.c:5:3: ошибка: format «%d» expects argument of type «int», but argument 2 has type «size_t» [-Werror=format=]
   printf("Entered: %d\n", var);
   ^
test.c:6:1: ошибка: control reaches end of non-void function [-Werror=return-type]
 }
 ^
cc1: all warnings being treated as errors


gcc -v
Используются внутренние спецификации.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-unknown-linux-gnu/4.8.2/lto-wrapper
Целевая архитектура: x86_64-unknown-linux-gnu
Параметры конфигурации: /build/gcc-multilib/src/gcc-4.8-20131219/configure --prefix=/usr --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=https://bugs.archlinux.org/ --enable-languages=c,c++,ada,fortran,go,lto,objc,obj-c++ --enable-shared --enable-threads=posix --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-clocale=gnu --disable-libstdcxx-pch --disable-libssp --enable-gnu-unique-object --enable-linker-build-id --enable-cloog-backend=isl --disable-cloog-version-check --enable-lto --enable-plugin --enable-install-libiberty --with-linker-hash-style=gnu --enable-multilib --disable-werror --enable-checking=release
Модель многопоточности: posix
gcc версия 4.8.2 20131219 (prerelease) (GCC)
false ★★★★★
()
Ответ на: комментарий от Eddy_Em

У меня выдаёт этот ворнинг только если указаны обе опции: -Wall --pedantic

Наверное этот ворнинг можно специальным флагом включить, но мне лень грепать info gcc.

anonymous
()
Ответ на: комментарий от anonymous

Компилируй с -Wall -Wextra --pedantic

С этими параметрами очень много предупреждений ненужных показывает

mrXorg
() автор топика
Ответ на: комментарий от Eddy_Em

Вон, читай что аноним про -pedantic говорил.

этот pedantic +100500 варнингов показывает для проекта, он придерается к фигне какой-то, а мне нужно чтобы в проекте только один варнинг этот находил, ибо я запускал проект на системе у друга и он показываел только один варнинг

mrXorg
() автор топика
Ответ на: комментарий от Eddy_Em

А при чем тут builtin-ы? Эти правила проверки указываются при объявлении функции в хидерах. Можно любую функцию пометить флагом «работает как scanf».

Скорее всего глюки особенности gcc. Он почему-то без --pedantic не хочет на моём компе в этом примере отличать int * от unsigned int *. (size_t это тайпдеф для unsigned int)

anonymous
()
Ответ на: комментарий от Eddy_Em

В мане написано

Ясно, последний раз я открывал ман на gcc года 3 назад. :D

anonymous
()
Ответ на: комментарий от Eddy_Em

погуголь

Нет инфы по поводу отключения. По ходу не впиливается она по-умолчанию.

mrXorg
() автор топика
Ответ на: комментарий от mrXorg

С этими параметрами очень много предупреждений ненужных показывает

Есть мнение, что в таких случаях надо предупреждения исправлять, а не забивать на них.

theNamelessOne ★★★★★
()
Последнее исправление: theNamelessOne (всего исправлений: 1)
Ответ на: комментарий от Eddy_Em

А, не: -pedantic много ненужных предупреждений дает (скажем, вложенные функции).

Если ты намеренно пишешь GCC-only код, тогда да. Я говорил про портируемый код.

theNamelessOne ★★★★★
()
Ответ на: комментарий от theNamelessOne

Есть мнение, что в таких случаях надо предупреждения исправлять, а не забивать на них.

Это тоже самое, что спорить, какой стиль кодирование лучше?

Допустим в больших проектах лучше объявлять переменные по мере использования, а не в начале. pedantic так не считает.

mrXorg
() автор топика

Хм, при использовании -pedantic в консоли, куча ненужных предупреждений. Но когда я добавил эту опцию в настройках eclipse (в котором я пишу и который постепенно ненавижу), то предупреждение появилось только одно и то, которое мне надо (про преобразование size_t в int). Не знаю, что за чудеса такие. Но проблема решена))). Всем спасибо.

mrXorg
() автор топика
Ответ на: комментарий от mrXorg

А не навижу eclipse за то, что придется в каждый проект эту опцию прописывать, а проектов туча...

mrXorg
() автор топика
Ответ на: комментарий от mrXorg

С этими параметрами очень много предупреждений ненужных показывает

с Wall Wextra фигни не показывает, я бы понял Weffc++ или Wshadow, но это, ИМХО, надо фиксить

Stil ★★★★★
()
Ответ на: комментарий от mrXorg

Это тоже самое, что спорить, какой стиль кодирование лучше?

Нет, это не то же самое.

Допустим в больших проектах лучше объявлять переменные по мере использования, а не в начале. pedantic так не считает.

Use -std=c99, Luke.

theNamelessOne ★★★★★
()

gcc -v покажешь? или бить твою тупую котячью морду за флейм?

anonymous
()
Ответ на: комментарий от tensai_cirno

Там действительно есть ненужные предупреждения. Я выше говорил: скажем, забульбенишь ты вложенные функции (это часто бывает необходимо), а gcc -pedantic матерится на это.

Вот такие пироги.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

А потому что в C нет вложенных функций. Хочешь использовать расширения GNU указывай это явно.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.