Технический форум по робототехнике.
Aseris » 19 июн 2018, 15:04
GCC компилятор анализирует варнинги и веселости кода в зависимости от уровня оптимизации.
Очень весело его было заставлять делать даную фичу "gcc failing to warn of uninitialized variable"
для кода:
static uint32_t CompilerWarningsTest(uint32_t input)
{
uint32_t result;
if ( input > 0 )
{
result = 10;
}
return result;
}
Но ет все лирика, грабли в том что в зависимости от включеного уровня оптимализации ( -Os/-O3 / -Of ) различается количество варнингов в коде
хотя -Wall -Wextra включены.
Очень неприятно найти ет перед релизом.
Вобщем при анализе кода хорошо его гонять при разых вариантах оптимизации, как я понял некоторый анализ включается ток при использовании алгоритмов оптимизации, и на флаги варнингов оно плюет с высокой горки .
Последний раз редактировалось
Aseris 19 июн 2018, 18:56, всего редактировалось 1 раз.
Dmitry__ » 19 июн 2018, 18:05
Ничего не понял (про наезд на gcc). Но сам код глупый
Если input <= 0, то надо возвращать неинициированную переменную. Надо, таки, "uint32_t result" как-то инициировать, если в коде присутствуют не все проверки.
Так надо:
- Код: Выделить всё • Развернуть
if ( input > 0 )
{
result = 10;
}
else
{
result = 0;
}
Aseris » 19 июн 2018, 18:14
Код специально чтоб сгенерировать ворнинг. Но gcc 6.3.1 в Attolic True Studio его генерить нехочет.
Последний раз редактировалось
Aseris 19 июн 2018, 18:15, всего редактировалось 1 раз.
Dmitry__ » 19 июн 2018, 18:15
А в чем грабля-то? Ну мелкий косяк...
Aseris » 19 июн 2018, 18:26
А грабля что когдато он ет делал, плюс ет моветон что от уровня оптимизации он генерит разные варнинги. Что с учетом разношерсной команды кодописателей становится грусно. нужно MISRA чекер из начальства выбивать чтоб более мение в коде быть уверенным.
Добавлено спустя 8 минут 23 секунды:В ту же копилку для тестов, мож кому надо, должно генерить варнинг про некоректное поведение, неработает при -Og и -O0, работает при -O3
- Код: Выделить всё • Развернуть
#define A_SIZE 10
uint8_t array[A_SIZE ];
void TestFunc(void)
{
uint32_t index
for ( index = A_SIZE ; index > 0; index-- )
{
array[index-1] = array[index-2];
}
}
Ворнинг про то что лезем мимо масива, неработает при -Og и -O0, работает при -O3
- Код: Выделить всё • Развернуть
uint8_t array[A_SIZE ];
array[A_SIZE ] = 0;
Мож я конечно гдето чтото в мануале недочитал...
Dmitry__ » 19 июн 2018, 18:29
Angel71 » 19 июн 2018, 18:34
студия, гнуарм. C11 (-std=c11), оптимизация o0, ничего. меняем варнинг лэвэл с Default на Pedantic (-Wall -Wextra -Wpedantic)
- Код: Выделить всё • Развернуть
1>Src\main.c(119,11): warning : unused variable 'ii' [-Wunused-variable]
1> uint32_t ii = CompilerWarningsTest(0);
переключаемся на og
- Код: Выделить всё • Развернуть
1>Src\main.c(119,11): warning : unused variable 'ii' [-Wunused-variable]
1> uint32_t ii = CompilerWarningsTest(0);
Aseris » 19 июн 2018, 18:39
Ну грабель в том что за время проекта я даный варнинг встречал, правда проекту уже 3 года и нчинался он на IDE v 5.0 ...шас уже 9.0.1, и после обновлений верил то что существующие фичи никто трогать небудет и в выпрямление рук у сотрудников и сильно код не проверял после кром код ревю.
"пишите нормально программы" и где такой персонал дают?
Добавлено спустя 2 минуты 6 секунд:Angel71 писал(а):студия, гнуарм. C11 ...
Все клас,
ток оно должно варнинг дать внутри функции на uint32_t result;
unused и uninitialized разные весчи, да и к оптимизации другой паровоз варнингов относитися
Angel71 » 19 июн 2018, 18:43
а, тфу блин. ii анюсед. ну дя, не выругалось.
тады ойсь.
Aseris » 19 июн 2018, 18:55
Вобщем при анализе кода хорошо его гонять при разых вариантах оптимизации, как я понял некоторый анализ включается ток при использовании алгоритмов оптимизации, и на флаги варнингов оно плюет с высокой горки
.
Dmitry__ » 19 июн 2018, 19:01
Aseris писал(а):как я понял некоторый анализ включается ток при использовании алгоритмов оптимизации, и на флаги варнингов оно плюет с высокой горки .
Ага, об этом говорят в моих ссылках.
Aseris писал(а):"пишите нормально программы" и где такой персонал дают?
Да фиг его знает
Я все пишу с нулевым уровнем оптимизации. Если становится тесно, тогда только начинаю мучить gcc. А вообще, в последнее время - быдлокодю жестко, заработало, ну и ладно
Angel71 » 19 июн 2018, 19:12
статические анализаторы кода на подобии
https://www.viva64.com/ru/pvs-studio/ подходят? на рутрекере некоторые вещи есть для попробовать.
варнинги и бяко-код это всё фигня. вот когда чип дерьмо глюкаво-недокументированное, вот это сила. грё mpu-9255...
Aseris » 19 июн 2018, 19:18
Статические анализаторы я и назвал MISRA чекер. Попробовать мне ненадо я с ними работал, но обычно все упирается в то что пока петух не клюнет руководство фиг деньги на лицензию даст, типа вы умные вы справитесь....но ет уже другие грабли... нужно завести скебе соглашение с рисками для руководства, и требовать подпись кровью чоб потом небыло а вы нам не говорили (по несколько раз на планерках) что без той штуки риски больше...
Angel71 » 19 июн 2018, 19:28
с новыми правилами вроде с записью видео не забалуешь - и так и так подпись клянчить. ну не переживай, некоторые насяльники могут себе позволить фразы "эт ты специально чтот ломаешь, что бы потом чинить" (знакомому недавно такое выдали, сильно задумался о смене места работы).
Aseris » 19 июн 2018, 19:32
... мнда все еше веселеее...
- Код: Выделить всё • Развернуть
...
for(i = 0; i < count; i++ )
{
ReadNormalEvent((uint32_t)eventIndex-i, &event);
if((event.eventNumber == eventTmp.eventNumber) && (i > 0) )
{
break;
}
memcpy( &eventTmp, &event, sizeof(Event_t) );
...
}
здесь оно в другой ветви проекта генерит варнинг
'eventTmp.eventNumber' may be used uninitialized in this function [-Wmaybe-uninitialized]
но блин проверочную функцию (из шапки) игнорит..
Осваивать чели багтрекер GCC
....