Граждане, не забывайте про -Wall
lexa - 25/Фев/2008 17:26
Как-то я даже удивился, ударившись примерно об такое вот:
// external.c:
float func() { return 1.0; }
// main.c
#include "stdio.h"
int main(void) {
float val = func();
printf("%f %f\n",val,func());
}
float func() { return 1.0; }
// main.c
#include "stdio.h"
int main(void) {
float val = func();
printf("%f %f\n",val,func());
}
Comments
да оно ж по дефолту материться должно. два раза.
да оно ж по дефолту материться должно.
два раза.
Ни слова не говорит. gcc 4.2.1 (FreeBSD 7-пререлиз)
Ни слова не говорит.
gcc 4.2.1 (FreeBSD 7-пререлиз)
В леопарде аналогично
В леопарде аналогично
<b>> В леопарде аналогично</b><br/> Можно подумать там не
> В леопарде аналогично
Можно подумать там не gcc...
Что я делаю не так? uieoaMac:temp motto$ gcc texa.c uieoaM
Что я делаю не так?
uieoaMac:temp motto$ gcc texa.c
uieoaMac:temp motto$ ./a.out
1.000000 1.000000
Я правда, поленился сделать два файла, но разве это должно влиять?
и влияет же!
и влияет же!
Вот-вот. А я сейчас делаю ровно обратную операцию - расчлен
Вот-вот.
А я сейчас делаю ровно обратную операцию - расчлененку из чужого исходника.
Спасает только md5 по результатам - моим и тем, которые должны быть.
А что тулзы для автоматического создания external.h нет? Или
А что тулзы для автоматического создания external.h нет?
Или это религиозно неправильно?
Да все есть. Мне просто казалось (ошибочно) что у компилятор
Да все есть.
Мне просто казалось (ошибочно) что у компилятора должны бы быть выражения по подобным поводам.
Однако нету.
Тутубалин поспорил с компилятором, то из них умнее Обе стор
Тутубалин поспорил с компилятором, то из них умнее
Обе стороны признали свое поражение
двоешник. вот из-за таких программистов все и страдают
двоешник.
вот из-за таких программистов все и страдают
Я ценнейший человек в этом смысле. Я не программирую, поэтом
Я ценнейший человек в этом смысле.
Я не программирую, поэтому страдания людей от моего кода полностью исключены!
А как я тут страдал в пятницу, когда перл на невиннейшей HTM
А как я тут страдал в пятницу, когда перл на невиннейшей HTML-ке в cp1251 вдруг взводил внутренний флаг 'utf-8'. Чуть голову себе об стену не разбил - дома работает, а на сервере - нет.
Оказалось, что перл бывает 5.8.8, а бывает 5.8.8_1 (причем вывод perl -V у них не отличается).
Уроды.
и какой глючит? отмена розг погубит эту цивилизацию
и какой глючит?
отмена розг погубит эту цивилизацию
Более старый - глючит. А для _1 - в ports/lang/perl5.8 лежи
Более старый - глючит.
А для _1 - в ports/lang/perl5.8 лежит патч, который правит другое, ну и сайд-эффектом - мою багу. Подозреваю, что в настоящем перле этой правки нет.
Розги уже бессильны, дустом надо.
от дуста не тот воспитательный фифект для окружающих
от дуста не тот воспитательный фифект для окружающих
<b>В Intel это хорошо понимают, видимо :-)</b><br/> <tt&g
В 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>
<b>Re: В Intel это хорошо понимают, видимо :-)</b><br/> Блин
Re: В Intel это хорошо понимают, видимо :-)
Блин, да это много где и кто понимает. Я был в абсолютной уверенности, что gcc на такое ругается. Сумлевался бы - поставил бы CFLAGS+=-Wall сразу.
Фишка, похоже, в другом. Очень мало кто продолжает программировать на C. А у плюсов _этой_ проблемы нет.
<b>Re: В Intel это хорошо понимают, видимо :-)</b><br/> На с
Re: В Intel это хорошо понимают, видимо :-)
На самом деле gcc - это самый плохой из известных мне компиляторов по части диагностики. Не просто плохой, а катастрофически отвратительный. Нашему проекту было бы сильно хуже, если бы в проекте не было меня, вооруженного msvc.
У нас, кстати, тыщ 50 на С написано.
<b>Re: В Intel это хорошо понимают, видимо :-)</b><br/> Мне
Re: В Intel это хорошо понимают, видимо :-)
Мне всегда хватало диагностики.
Хотя, наверное, можно и получше...
<b>Re: В Intel это хорошо понимают, видимо :-)</b><br/> Я не
Re: В Intel это хорошо понимают, видимо :-)
Я не понимаю как может хватать диагностики если gcc не ловит отсутствия return something; в конце функции, задекларированной как возвращающей не void. И функция реально приносит caller'у содержимое аккумулятора от последней операции. Ну и много что еще, я список не вел на нашем проекте, но там много чего было. И в моем коде на ++ там хватает комментариев о том что бы я сделал с авторами этих помоев, если бы до них добрался.
<b>Re: В Intel это хорошо понимают, видимо :-)</b><br/> Да в
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
<b>Re: В Intel это хорошо понимают, видимо :-)</b><br/> в ка
Re: В Intel это хорошо понимают, видимо :-)
в какой-то более сложной ситуации он промахивается. времени сейчас в обрез, а то я б из hg вытащил.
<b>Re: В Intel это хорошо понимают, видимо :-)</b><br/> Инте
Re: В Intel это хорошо понимают, видимо :-)
Интеловский icc на линуксе, насколько я знаю, использует фронтенд от гцц, со всеми вытекающими.
Это еще хорошо, т.к. плохо работает на всех платформах. А ес
Это еще хорошо, т.к. плохо работает на всех платформах. А если функция возвращает указатель, то где-то работает, а где-то падает.
Есть над чем задуматься.
Есть над чем задуматься.
Вы за свои слова ответить можете? Делаю намек - если такая к
Вы за свои слова ответить можете? Делаю намек - если такая контора как Интел (жирная и всем откусить охота) юзает гцц-овый код, то ищите в ридми упоминание (в такой то программе был заюзан такой-то код). И если не найдете - либо срочно в суд, либо срочно об стену.
ЗЫ. А вообще у него свой залицензированный фронтенд. Перегоняющий фортран и С в промежуточный код IL0.
Не забывайте не только про -Wall и -pedantic, но и про сущес
Не забывайте не только про -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