Jump to content

    
jenya7

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

Recommended Posts

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

Share this post


Link to post
Share on other sites
7 минут назад, jenya7 сказал:

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

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

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

Share this post


Link to post
Share on other sites
1 hour ago, jcxz said:

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

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

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

 

Edited by jenya7

Share this post


Link to post
Share on other sites
1 minute ago, jenya7 said:

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

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

1 minute ago, jenya7 said:

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

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

Share this post


Link to post
Share on other sites
1 hour ago, jcxz said:

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

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

 

Share this post


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

Share this post


Link to post
Share on other sites
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 но это много накладных расходов. проблема однако.

 

Share this post


Link to post
Share on other sites
1 minute ago, jenya7 said:

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

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

Share this post


Link to post
Share on other sites
7 минут назад, jenya7 сказал:

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

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

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

Share this post


Link to post
Share on other sites
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.....

Edited by jenya7

Share this post


Link to post
Share on other sites
1 minute ago, jenya7 said:

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

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

2 minutes ago, jenya7 said:

а может и так

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

IF SENS == 20 + 5j THEN 

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

Share this post


Link to post
Share on other sites
1 hour ago, haker_fox said:

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

 

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

1 hour ago, haker_fox said:

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.