jenya7 0 21 октября, 2020 Опубликовано 21 октября, 2020 · Жалоба При обычной компиляции все чики-пуки - no warnings. И тут я решил запустить C-STAT analysis. Он мне вывалил предупреждений - мама не горюй. например float val = -1; if (val != -1) { //do something } Comparison with a float using == or != ну тут я могу сделать кастинг if ((int)val != -1) но есть случай где я не могу этого сделать static uint32_t ProcessCompare(float l, float r, uint8_t oper) { switch (oper) { case OP_EQ: return (l == r); case OP_GT: return (l > r); case OP_LT: return (l < r); case OP_GE: return (l >= r); case OP_LE: return (l <= r); case OP_NE: return (l != r); default : return 0; } } вопрос - не обращать внимание или все таки устранять предупреждения? сам компайлер не ругается. или это такой маркетинговый ход - хочеш честную компиляцию - купи лайсенс и получи C-STAT analysis? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 187 21 октября, 2020 Опубликовано 21 октября, 2020 · Жалоба 7 минут назад, jenya7 сказал: вопрос - не обращать внимание или все таки устранять предупреждения? сам компайлер не ругается. или это такой маркетинговый ход - хочеш честную компиляцию - купи лайсенс и получи C-STAT analysis? Ответ: Подумать и понять - почему он (компилятор) их (предупреждения) выдаёт. А выдаёт он их неспроста.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 21 октября, 2020 Опубликовано 21 октября, 2020 (изменено) · Жалоба 1 hour ago, jcxz said: Ответ: Подумать и понять - почему он (компилятор) их (предупреждения) выдаёт. А выдаёт он их неспроста.... я понимаю что неспроста, вопрос заморачиваться или нет? компайлер то компилирует без предупреждений, с его стороны все хорошо. Изменено 21 октября, 2020 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 187 21 октября, 2020 Опубликовано 21 октября, 2020 · Жалоба 3 минуты назад, jenya7 сказал: я понимаю что неспроста Что это понимаете - хорошо, а понимаете почему он (анализатор) такое выдаёт? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 21 октября, 2020 Опубликовано 21 октября, 2020 · Жалоба 1 minute ago, jenya7 said: вопрос заморачиваться или нет? Ну это равнозначно вопросу: "Перебегать на мигающий зелёный или нет?" Сами решайте. Я заморачиваюсь. 1 minute ago, jenya7 said: компайлер то компилирует без предупреждений, с его стороны все хорошо. Не всякий компилятор выполняет роль статического анализатора. И не зря эти программы существуют в виде отдельных модулей. GCC, насколько я помню, более строк к коду, особенно если ему ещё и ключи различные задать в командной строке. IAR'у вы тоже можете дополнительные ключики вписать. Мой любимый ключик: --warnings_are_errors. Теперь у коллег нет соблаза оставить "варнинг" - он же, типа, не ошибка. При этом они совершенно не анализируют причину предупреждения. С таким ключиком предупреждений нет. Только ошибки. Можете доабвить ключик --remarks. Будет забавный выхлоп от компиялтора. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 21 октября, 2020 Опубликовано 21 октября, 2020 · Жалоба 1 hour ago, jcxz said: Что это понимаете - хорошо, а понимаете почему он (анализатор) такое выдаёт? сравнение float это проблема, я уже встречался с этим. но что делать когда очень хочеться надо? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 187 21 октября, 2020 Опубликовано 21 октября, 2020 · Жалоба 1 минуту назад, haker_fox сказал: Ну это равнозначно вопросу: "Перебегать на мигающий зелёный или нет?" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 21 октября, 2020 Опубликовано 21 октября, 2020 · Жалоба 1 hour ago, haker_fox said: Мой любимый ключик: --warnings_are_errors. для компайлера это даже не warnings - Total number of warnings: 0. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 21 октября, 2020 Опубликовано 21 октября, 2020 · Жалоба 31 minutes ago, jenya7 said: для компайлера это даже не warnings - Total number of warnings: 0. Расширяйте кругозор) Посмотрите, как устроено float с точки зрения его двоичного представления и вы поймёте почему статический анализатор вам выдаёт предупреждение. Может быть для -1 проблем и не будет, но для любого другого числа они могут возникнуть. Например, вы присваиваете переменной float a = 1.5f; Реально, переменная a может содержать 1.4999999. Я пример привёл без проверки, да это и не нужно. Теперь представьте, что вы сравниваете своё a таким образом if( a == 1.5 ) Результат сравнения не обязан быть true. Почему не выдаёт IAR предупреждений - не знаю. Вопрос можете им задать. Я проверяю код после компиляции двумя статическими анализаторами: встроенным в IAR IDE и cppcheck. И то не всегда они подмечают подобные ляпы. В инете есть статьи на тему, как правильно сравнивать числа типа float. Это точно нельзя делать обычными операторами. Почитайте. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 21 октября, 2020 Опубликовано 21 октября, 2020 · Жалоба 1 hour ago, haker_fox said: Расширяйте кругозор) Посмотрите, как устроено float с точки зрения его двоичного представления и вы поймёте почему статический анализатор вам выдаёт предупреждение. Может быть для -1 проблем и не будет, но для любого другого числа они могут возникнуть. Например, вы присваиваете переменной float a = 1.5f; Реально, переменная a может содержать 1.4999999. Я пример привёл без проверки реального числа, да это и не нужно. Теперь представьте, что вы сравниваете своё a таким образом if( a == 1.5 ) Результат сравнения не обязан быть true. Почему не выдаёт IAR предупреждений - не знаю. Вопрос можете им задать. Я проверяю код после компиляции двумя статическими анализаторами: встроенным в IAR IDE и cppcheck. я могу конечно округлять float но это много накладных расходов. проблема однако. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 21 октября, 2020 Опубликовано 21 октября, 2020 · Жалоба 1 minute ago, jenya7 said: я могу конечно округлять float но это много накладных расходов. проблема однако. Вы можете делать, как угодно. Если это удовлетворяет критериям решения вашей задачи. Пока не понятно, что вы хотите от нас? Чтобы мы за вас решили. стоит ли вам заморачиваться на предупреждение анализатора? Это зависиот от того, что делает ваш прибор. Если он управляет детским светофором, можно и не заморачиваться. Но не смутят ли вас слёзы маленького ребёнка, когда его светофор вместо 5 секунд будет гореть красным цветом 2 часа?) А если ваша железка управляет турникетом на заводе, то за задержку очереди на 5 секунд вам могут оторвать... премию)))) Думайте сами, решайте сами. Или выкладывайте сюда больше информации) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 187 21 октября, 2020 Опубликовано 21 октября, 2020 · Жалоба 7 минут назад, jenya7 сказал: я могу конечно округлять float но это много накладных расходов. проблема однако. #define IS_EQ(a, b, delta) ((float)(a) > (float)(b) - (float)(delta) && (float)(a) < (float)(b) + (float)(delta)) спасёт отца русской демократии! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 21 октября, 2020 Опубликовано 21 октября, 2020 (изменено) · Жалоба 1 hour ago, jcxz said: #define IS_EQ(a, b, delta) ((a) > (b) - (delta) && (a) < (b) + (delta)) спасёт отца русской демократии! ну ничё так :)) проблема выбрать delta. пользователь может захотеть IF SENS0==25.5 THEN..... а может и так IF SENS0==25.55 THEN..... Изменено 21 октября, 2020 пользователем jenya7 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 21 октября, 2020 Опубликовано 21 октября, 2020 · Жалоба 1 minute ago, jenya7 said: пользователь может захотеть Уж не продолжение ли это одной из ваших тем про ПЛК и язык программирования к нему? 2 minutes ago, jenya7 said: а может и так А вы его ограничьте в желаниях. А то он ещё так захочет IF SENS == 20 + 5j THEN Мало ли, чувак с вышмата вышел, и мыслит комплексными числами) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jenya7 0 21 октября, 2020 Опубликовано 21 октября, 2020 · Жалоба 1 hour ago, haker_fox said: Уж не продолжение ли это одной из ваших тем про ПЛК и язык программирования к нему? ну в данном случае да, это касается пользовательского скрипта. 1 hour ago, haker_fox said: А вы его ограничьте в желаниях. А то он ещё так захочет тут не простое решение. хочеться чтоб система была крутая :)) чай не дети :)) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться