Skip to Content

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

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

  1. // external.c:
  2. float func() { return 1.0; }
  3.  
  4. // main.c
  5. #include "stdio.h"
  6. int main(void) {
  7.   float val = func();
  8.   printf("%f %f\n",val,func());
  9. }
stdio не в тех кавычках т.к. иначе RSS испортится, а < не понимает красивый форматтер :)

Comments

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

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

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

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

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

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

<b>&gt; В леопарде аналогично</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/> &lt;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

Post new comment

The content of this field is kept private and will not be shown publicly.
  • Web page addresses and e-mail addresses turn into links automatically.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <s> <i> <b> <blockquote>
  • Lines and paragraphs break automatically.
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>, <c>, <cpp>, <drupal5>, <drupal6>, <java>, <javascript>, <php>, <ruby>. The supported tag styles are: <foo>, [foo].
  • Images can be added to this post.

More information about formatting options



.