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

Статический анализ (C-STAT analysis) глубоко копает.

При обычной компиляции все чики-пуки - 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?

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


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

7 минут назад, jenya7 сказал:

вопрос - не обращать внимание или все таки устранять предупреждения? сам компайлер не ругается. или это такой маркетинговый ход - хочеш честную компиляцию - купи лайсенс и получи C-STAT analysis?

Ответ: Подумать и понять - почему он (компилятор) их (предупреждения) выдаёт.

А выдаёт он их неспроста....

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


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

1 hour ago, jcxz said:

Ответ: Подумать и понять - почему он (компилятор) их (предупреждения) выдаёт.

А выдаёт он их неспроста....

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

 

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

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


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

3 минуты назад, jenya7 сказал:

я понимаю что неспроста

Что это понимаете - хорошо, а понимаете почему он (анализатор) такое выдаёт?

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


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

1 minute ago, jenya7 said:

вопрос заморачиваться или нет?

Ну это равнозначно вопросу: "Перебегать на мигающий зелёный или нет?" Сами решайте. Я заморачиваюсь.

1 minute ago, jenya7 said:

компайлер то компилирует без предупреждений, с его стороны все хорошо.

Не всякий компилятор выполняет роль статического анализатора. И не зря эти программы существуют в виде отдельных модулей. GCC, насколько я помню, более строк к коду, особенно если ему ещё и ключи различные задать в командной строке. IAR'у вы тоже можете дополнительные ключики вписать. Мой любимый ключик: --warnings_are_errors. Теперь у коллег нет соблаза оставить "варнинг" - он же, типа, не ошибка. При этом они совершенно не анализируют причину предупреждения. С таким ключиком предупреждений нет. Только ошибки. Можете доабвить ключик --remarks. Будет забавный выхлоп от компиялтора.

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


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

1 hour ago, jcxz said:

Что это понимаете - хорошо, а понимаете почему он (анализатор) такое выдаёт?

сравнение float это проблема, я уже встречался с этим. но что делать когда очень хочеться надо?

 

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


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

1 минуту назад, haker_fox сказал:

Ну это равнозначно вопросу: "Перебегать на мигающий зелёный или нет?"

:good:

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


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

1 hour ago, haker_fox said:

 Мой любимый ключик: --warnings_are_errors.

для компайлера это даже не warnings - Total number of warnings: 0.

 

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


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

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. Это точно нельзя делать обычными операторами. Почитайте.

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


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

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 но это много накладных расходов. проблема однако.

 

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


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

1 minute ago, jenya7 said:

я могу конечно округлять float но это много накладных расходов. проблема однако.

Вы можете делать, как угодно. Если это удовлетворяет критериям решения вашей задачи. Пока не понятно, что вы хотите от нас? Чтобы мы за вас решили. стоит ли вам заморачиваться на предупреждение анализатора? Это зависиот от того, что делает ваш прибор. Если он управляет детским светофором, можно и не заморачиваться. Но не смутят ли вас слёзы маленького ребёнка, когда его светофор вместо 5 секунд будет гореть красным цветом 2 часа?) А если ваша железка управляет  турникетом на заводе, то за задержку очереди на 5 секунд вам могут оторвать... премию)))) Думайте сами, решайте сами. Или выкладывайте сюда больше информации)

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


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

7 минут назад, jenya7 сказал:

я могу конечно округлять float но это много накладных расходов. проблема однако.

#define IS_EQ(a, b, delta) ((float)(a) > (float)(b) - (float)(delta) && (float)(a) < (float)(b) + (float)(delta))

спасёт отца русской демократии!

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


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

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.....

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

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


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

1 minute ago, jenya7 said:

пользователь может захотеть

Уж не продолжение ли это одной из ваших тем про ПЛК и язык программирования к нему?

2 minutes ago, jenya7 said:

а может и так

А вы его ограничьте в желаниях. А то он ещё так захочет

IF SENS == 20 + 5j THEN 

Мало ли, чувак с вышмата вышел, и мыслит комплексными числами)

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


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

1 hour ago, haker_fox said:

Уж не продолжение ли это одной из ваших тем про ПЛК и язык программирования к нему?

 

ну в данном случае да, это касается пользовательского скрипта.

1 hour ago, haker_fox said:

А вы его ограничьте в желаниях. А то он ещё так захочет

тут не простое решение. хочеться чтоб система была крутая :)) чай не дети :))

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


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

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

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

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

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

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

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

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

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

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