Граждане, не забывайте про -Wall

Как-то я даже удивился, ударившись примерно об такое вот:

// external.c:
float func() { return 1.0; }

// main.c
#include "stdio.h"
int main(void) {
  float val = func();
  printf("%f %f\n",val,func());
}
stdio не в тех кавычках т.к. иначе RSS испортится, а < не понимает красивый форматтер :)

Comments

да оно ж по дефолту материться должно.
два раза.

Ни слова не говорит.
gcc 4.2.1 (FreeBSD 7-пререлиз)

В леопарде аналогично

> В леопарде аналогично
Можно подумать там не gcc...

Что я делаю не так?

uieoaMac:temp motto$ gcc texa.c
uieoaMac:temp motto$ ./a.out
1.000000 1.000000

Я правда, поленился сделать два файла, но разве это должно влиять?

и влияет же!

Вот-вот.

А я сейчас делаю ровно обратную операцию - расчлененку из чужого исходника.

Спасает только md5 по результатам - моим и тем, которые должны быть.

А что тулзы для автоматического создания external.h нет?
Или это религиозно неправильно?

Да все есть.
Мне просто казалось (ошибочно) что у компилятора должны бы быть выражения по подобным поводам.

Однако нету.

Тутубалин поспорил с компилятором, то из них умнее

Обе стороны признали свое поражение

двоешник.
вот из-за таких программистов все и страдают

Я ценнейший человек в этом смысле.
Я не программирую, поэтому страдания людей от моего кода полностью исключены!

А как я тут страдал в пятницу, когда перл на невиннейшей HTML-ке в cp1251 вдруг взводил внутренний флаг 'utf-8'. Чуть голову себе об стену не разбил - дома работает, а на сервере - нет.

Оказалось, что перл бывает 5.8.8, а бывает 5.8.8_1 (причем вывод perl -V у них не отличается).
Уроды.

и какой глючит?

отмена розг погубит эту цивилизацию

Более старый - глючит.

А для _1 - в ports/lang/perl5.8 лежит патч, который правит другое, ну и сайд-эффектом - мою багу. Подозреваю, что в настоящем перле этой правки нет.

Розги уже бессильны, дустом надо.

от дуста не тот воспитательный фифект для окружающих

В Intel это хорошо понимают, видимо :-)
<tt>arch% gcc try{,2}.c -o try.exe
try2.c:1:29: warning: no newline at end of file

arch% tcc try{,2}.c -o try.exe

arch% icc try{,2}.c -o try.exe
try.c(7): warning #266: function "func" declared implicitly
float val = func();
^

try.c(8): warning #181: argument is incompatible with corresponding format string conversion
printf("%f %f\n",val,func());
^
</tt>

Re: В Intel это хорошо понимают, видимо :-)
Блин, да это много где и кто понимает. Я был в абсолютной уверенности, что gcc на такое ругается. Сумлевался бы - поставил бы CFLAGS+=-Wall сразу.

Фишка, похоже, в другом. Очень мало кто продолжает программировать на C. А у плюсов _этой_ проблемы нет.

Re: В Intel это хорошо понимают, видимо :-)
На самом деле gcc - это самый плохой из известных мне компиляторов по части диагностики. Не просто плохой, а катастрофически отвратительный. Нашему проекту было бы сильно хуже, если бы в проекте не было меня, вооруженного msvc.

У нас, кстати, тыщ 50 на С написано.

Re: В Intel это хорошо понимают, видимо :-)
Мне всегда хватало диагностики.

Хотя, наверное, можно и получше...

Re: В Intel это хорошо понимают, видимо :-)
Я не понимаю как может хватать диагностики если gcc не ловит отсутствия return something; в конце функции, задекларированной как возвращающей не void. И функция реально приносит caller'у содержимое аккумулятора от последней операции. Ну и много что еще, я список не вел на нашем проекте, но там много чего было. И в моем коде на ++ там хватает комментариев о том что бы я сделал с авторами этих помоев, если бы до них добрался.

Re: В Intel это хорошо понимают, видимо :-)
Да вроде ругается:
int func(void) {
int aa = rand();
}

lexa@213:~# gcc -c -Wall a.c
a.c: In function func :
a.c:2: warning: implicit declaration of function rand
a.c:2: warning: unused variable aa
a.c:3: warning: control reaches end of non-void function

Re: В Intel это хорошо понимают, видимо :-)
в какой-то более сложной ситуации он промахивается. времени сейчас в обрез, а то я б из hg вытащил.

Re: В Intel это хорошо понимают, видимо :-)
Интеловский icc на линуксе, насколько я знаю, использует фронтенд от гцц, со всеми вытекающими.

Это еще хорошо, т.к. плохо работает на всех платформах. А если функция возвращает указатель, то где-то работает, а где-то падает.

Есть над чем задуматься.

Вы за свои слова ответить можете? Делаю намек - если такая контора как Интел (жирная и всем откусить охота) юзает гцц-овый код, то ищите в ридми упоминание (в такой то программе был заюзан такой-то код). И если не найдете - либо срочно в суд, либо срочно об стену.

ЗЫ. А вообще у него свой залицензированный фронтенд. Перегоняющий фортран и С в промежуточный код IL0.

Не забывайте не только про -Wall и -pedantic, но и про существование разных стандартов C. Когда-то вызов необъявленной функции был вполне разрешен стандартом. Укажите компилятору какому стандарту сдедовать и всем полегчает:

$ gcc -std=c89 -c n.c
$ gcc -std=c99 -c n.c
n.c: В функции main
n.c:3: предупреждение: implicit declaration of function func

Add new comment