Перейти к содержанию
    

Компилятор IAR 8.5 Си не дает ошибку

IAR 8.5, stm32f*, пишу код в *.с файле

void myFunc(void)

{

drfkgjklj();

}

drfkgjklj() - такая функция ни где не определена и ни где не объявлена. Запускаю сборку. Компилятор выдает

Quote

Warning[Pe223]: function "drfkgjklj" declared implicitly

 

Какой к черту implicitly? Это всегда так в си, или где-то в настройках проекта лядский флаг стоит? Я ожидаю, что компилятор выдаст

Error[Pe020]: identifier "drfkgjklj" is undefined 

 

Изменено пользователем haker_fox
Внимательно выбирайте раздел для создания темы!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

17 минут назад, razrab83 сказал:

Какой к черту implicitly? Это всегда так в си, или где-то в настройках проекта лядский флаг стоит? Я ожидаю, что компилятор выдаст

Error[Pe020]: identifier "drfkgjklj" is undefined 

Компилятор ругается на implicitly (Pe223), когда функция вызвана без прототипа. То бишь функцию сперва требуется объявить (чтобы компилятор понял какого типа у нее аргументы) и уж только потом ее вызывать.

А на identifier ругается (Pe020), когда используете переменную и массив, которые прежде не были созданы.

Это разные ошибки, а потому и коды у них разные - Pe223 и Pe020.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, razrab83 said:

IAR 8.5, stm32f*, пишу код в *.с файле

IAR - это грёбаный трэш.

Столкнулся с тем, что оптимизация в IAR - ***.   В GCC результат лучше.

Результаты замера ниже - кодек Рида-Соломона : на 4096 слов + 256 проверочные.  Слева - IAR, справа - GCC.

image.png.7dde31403c59e8e21346dfc210a4779c.pngimage.png.660723046f53187f15ea03ebeb24c3a4.png

 

Воркбенч - погонять:   rs.zip

Изменено пользователем repstosw

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

40 minutes ago, razrab83 said:

Это всегда так в си

Конечно всегда. Надо хотя бы стандарт С по диагонали посмотреть.

13 minutes ago, repstosw said:

что оптимизация в IAR - ***

Какие настройки оптимизации ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

29 minutes ago, x893 said:

Какие настройки оптимизации ?

IAR:

image.thumb.png.1548aa322b2075cb451eb0b583dc0c26.png

 

GCC:

-Ofast -mfloat-abi=hard -mfpu=vfpv4 -mfpu=neon -fomit-frame-pointer -ftree-vectorize -fno-math-errno

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

29 минут назад, repstosw сказал:

IAR:

для IAR частенько "balanced" оптимизация генерит более быстрый код, чем "speed". А иногда идаже и "size" оптимизация даёт более быстрый код.

Так как компилятор, выполняя оптимизацию, не учитывает размеров кеша.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 hours ago, repstosw said:

IAR - это грёбаный трэш.

Давно не работал с IAR, но когда последний раз переносил проект из него в GCC (если не ошибаюсь, была версия 8 ИАРа), обратил внимание, что по умолчанию в нём отключено очень много проверок кода, поэтому он легко проглатывает всякую хрень, подобную показанной выше. Зато работает ооочень быстро. Включение всех проверок в разы снижало скорость компиляции, зато поведение компилятора в виде сообщений об ошибках и предупреждений становилось похожим на GCC. Скорость кода не сравнивал, зато чётко было видно, что сборка кода компилятором С++ от ИАР  выявила те же самые ошибки, которые в С были выявлены только статическим анализатором. А вот в GCC наоборот, сразу включено много проверок.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 hours ago, tonyk_av said:

Включение всех проверок в разы снижало скорость компиляции

Можно узнать, о каких проверках Вы говорите?

Я добавляю только такой ключ ко всем проектам:

--warnings_are_errors

Чтобы не оставить ни одного предупреждения в неисправленном состоянии)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, haker_fox said:

Можно узнать, о каких проверках Вы говорите?

В той версии ИАР, с которой я пересекался, была вкладка с настройками компилятора. Их там было не мало. Например, из того что помню, реакция на неопределённую weak-функцию: поставить адрес 0 и продолжить компиляцию или выдать ошибку.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

10 часов назад, tonyk_av сказал:

в GCC (если не ошибаюсь, была версия 8 ИАРа), обратил внимание, что по умолчанию в нём отключено очень много проверок кода, поэтому он легко проглатывает всякую хрень, подобную показанной выше.

сделал холоворд в кубе на пуре СИ (gcc)

int main(void)
{
  HAL_Init();
  sdfds();
  SystemClock_Config();

...

Компилятор выдал ошибку (не линкер, а компилятор) ВЫДАЛ ВОРНИНГ!!!, а линкер ошибку. 

arm-none-eabi-gcc "../Core/Src/main.c"                  warning: implicit declaration of function 'sdfds'

с++ на такое выдают ошибку, а си ворнинг. Конечно для меня это дико. дабылКлик по ошибке компилятора - и улетаешь на нужную строку кода. ДабылКлик по ошибке линкера и .... НИЧЕГО.

погуглил.... есть в gcc "-Wimplicit-function-declaration", а ещё есть "-pedantic-errors". pedantic-errors генеригует на подобную дичь, как и пологается, ошибку компилятора. Но это "загнивающие" gcc. А что касается православного тру иаровского компилятора, то у него нет ни pedantic-errors, ни Wimplicit-function-declaration. 

Заседание продолжается..... кто знает, как в иаровском компиляторе заставить генерировать ошибку на implicit function declaration?

 

ps

15 часов назад, x893 сказал:

Какие настройки оптимизации ?

оптимизация отключена. 

 

15 часов назад, x893 сказал:

Надо хотя бы стандарт С по диагонали посмотреть.

а в стандарте си описано на что компилятор должен выдавать ошибки, а на что ворненги?

Изменено пользователем razrab83

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Цитата

Если функция предварительно не была объявлена, а её имя встречается в выражении, сразу за которым следует открывающая скобка, то она неявно объявляется как функция, возвращающая результат типа int и ничего не предполагается о её аргументах. В этом случае компилятор не сможет выполнить проверку типов аргументов и арность, когда функция вызывается с некоторыми аргументами. Это потенциальный источник проблем.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 hours ago, jcxz said:

для IAR частенько "balanced" оптимизация генерит более быстрый код, чем "speed". А иногда идаже и "size" оптимизация даёт более быстрый код.

Так как компилятор, выполняя оптимизацию, не учитывает размеров кеша.

Я проверил эти утверждения.

Увы, после установки Balanced или Size  скорость выполнения программы стала ещё меньше.

Обновлённый бенчмарк:  rs2.zip

Слева - GCC 11, справа - IAR 7.60 (процессор allwinner T113-s3 На штатной частоте):

image.png.09d721cb3ce39fa8dac38b330ea05fa7.pngimage.png.4f8def235a2d910ef17a0cd291532303.png

 

Изменено пользователем repstosw

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 04.08.2023 в 08:19, razrab83 сказал:

кто знает, как в иаровском компиляторе заставить генерировать ошибку на implicit function declaration?

Project->Options...->C/C++Compiler->Diagnostics->Treat these as errors: вписать Pe223

 

ps можно больше, синтаксис

Pe223, Pa181, Pe177

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 минут назад, juvf сказал:

Project->Options...->C/C++Compiler->Diagnostics->Treat these as errors: вписать Pe223

Спасибо! Проблема решена. Расходимся. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 hours ago, razrab83 said:

Компилятор выдал ошибку (не линкер, а компилятор) ВЫДАЛ ВОРНИНГ!!!, а линкер ошибку.

Возможно, ИАР изменил настройки компилятора и линкёра в новых версиях. Я потому и запомнил ту ситуацию с weak, что ни компилятор, ни линкёр даже предупреждения не давали. В программе адреса этих функций находились в таблице переходов, поэтому я не сразу догадался, почему МК уходил на адрес 0. Кстати, после того проекта я стал даже сишные файлы стал компилировать плюсОвым компилятором, ибо глубина анализа программы у плюсОвого больше, поэтому ошибок и предупреждений он выдаёт заметно больше, хотя работает на порядок быстрее статического анализатора для сишных программ, выдающего в итоге те же самые ошибки и предупреждения.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...