-
- #14 Сделал такой костыль, после чего ошибки компиляции исчезли. "Done. 0 error(s), 0 warning(s) ". Не откажите в любезности, гляньте, правильно ли? teap0t(753 знак., 24.09.2020 17:26)
- И вопрос такой - а где находится этот костыль? Ты решил менять
файлы библиотек? - RxTx(25.09.2020 02:10)
- Не понял вопрос. Макрос, который я поправил, находится в заголовочном файле конфигурации для переферийной библиотеки "stm32l1xx_conf.h". Частью библиотеки он не является (?) и лежит рядом с заголовочным файлом проекта "main.h" В нём перечисляется периферия, используемая в проекте и этот самый "#define assert_param(expr)" . И там же можно активировать флаг "использовать библиотеку" (по умолчанию закомментирован). Имея костыль, файлы библиотек менять не teap0t(273 знак., 26.09.2020 07:54, ссылка)
- К тебе два вопроса на засыпку ;) Какой смысл имеет (или можно так -
во что скомпилируется?) код: RxTx(136 знак., 25.09.2020 01:37)
- Этот вопрос я тоже не понял, но схитрил и проверил компилятором.
Получил то же самое, но без защитной обёртки (без подавления
ошибок). Вот так выглядит вызов после препроцессора: teap0t(1629 знак., 25.09.2020 09:08 - 09:16)
- (void)0 - пустое выражение, хак, компилер не генерирует код. Макро
можно было просто сделать пустым и в локальном случае это может
сработать, но не во всех. Проблема будет там, где пустой макрос
будет включен в код. RxTx(412 знак., 25.09.2020 17:29)
- Получается как в известном анекдоте. "Я только час русский, но как же я вас жидов ненавижу!" Только, панимаешь, нАчал, и на тебе! "Семантика", ёшкин кот! Этот херов (void)0 не я придумал. Я ещё маленький. Я честно всё списал у ST и по вами же подсунутой (о боги! сколько коварства!) ссылке на материал по макросам. - teap0t(25.09.2020 20:02 - 26.09.2020 08:00, ссылка)
- Кстати, а вариант do ; while(0) не был бы лучше в качестве пустышки? - VLLV(26.09.2020 00:00)
- Я так понял, ему именно запятые между ассертами хотелось. Зачем --
непонятно. - SciFi(25.09.2020 09:09)
- Ага. Но я могу прикинуться шлангом и продемонстрировать исходник. - teap0t(25.09.2020 09:12)
- (void)0 - пустое выражение, хак, компилер не генерирует код. Макро
можно было просто сделать пустым и в локальном случае это может
сработать, но не во всех. Проблема будет там, где пустой макрос
будет включен в код. RxTx(412 знак., 25.09.2020 17:29)
- Этот вопрос я тоже не понял, но схитрил и проверил компилятором.
Получил то же самое, но без защитной обёртки (без подавления
ошибок). Вот так выглядит вызов после препроцессора: teap0t(1629 знак., 25.09.2020 09:08 - 09:16)
- Потом вы берете код с ассертами, который как-бы соответствует
мисре, вставляете в другой проект, который тоже должен ей
соответствовать, но без дефайна. И все ломается. Может проще
ассерты скриптом выпилить? - s_h_e(24.09.2020 17:53)
- Этот вариант был оставлен на "потом", если решение не найдётся.
Решение нашлось. Обучение идёт, опыт появляется... А как взять код
с ассертами без дифайна? assert_param(expr) при этом повисает в воздухе. Код вот так выглядит: teap0t(349 знак., 24.09.2020 18:26)
- Не знаю, наверное никак. s_h_e(179 знак., 24.09.2020 18:32)
- Вроде бы мисра -- это за всё хорошее и против всего плохого. И вот
под флагом мисры предлагается выпилить ассерты, что есть
безусловное зло. Впрочем, кого это может удивить? - SciFi(24.09.2020 17:58)
- Я не уверен, что это за все хорошее. s_h_e(127 знак., 24.09.2020 18:01)
- Этот вариант был оставлен на "потом", если решение не найдётся.
Решение нашлось. Обучение идёт, опыт появляется... А как взять код
с ассертами без дифайна? assert_param(expr) при этом повисает в воздухе. Код вот так выглядит: teap0t(349 знак., 24.09.2020 18:26)
- Если быть до конца принципиальным, то выключая проверку, надо
оставлять в комментариях пояснения, зачем и на основании чего её
выключили. Вплоть цитат со ссылкой на интернет-конференцию, где
обсудили вопрос. - Nikolay_Po(24.09.2020 17:30)
- Это да, но пока речь только о коде. Документирование таких финтов - одно из требований той же MISRA. - teap0t(24.09.2020 17:36)
- Разве в окне MISRA нельзя снять плюсик контроля? Или нужны шашечки? - VLLV(24.09.2020 17:27)
- Семён Семёныч! Но шашечки тоже пригодятся. UPD. Предлагаемый способ
не отключает предупреждения совсем, но затеняет одну лишь нужную
команду. Так что, не шашечки это. - teap0t(24.09.2020 17:31 - 17:40)
- "0 warnings" сомнительное достижение, но достижение, тем не менее
:-) - SciFi(24.09.2020 17:32)
- Фиксирую
первуювторую победу. Первой было исправление ошибки в показаниях температуры. Я молодец. - teap0t(24.09.2020 17:38) - Нифига не сомнительное, а нужное и полезное. - Nikolay_Po(24.09.2020 17:34)
- Фиксирую
- Шашечки - для слабаков. К тому же, они бывают в руках у проверяющего. Поэтому нужно выкручиваться своими силами. - Nikolay_Po(24.09.2020 17:32)
- "0 warnings" сомнительное достижение, но достижение, тем не менее
:-) - SciFi(24.09.2020 17:32)
- Семён Семёныч! Но шашечки тоже пригодятся. UPD. Предлагаемый способ
не отключает предупреждения совсем, но затеняет одну лишь нужную
команду. Так что, не шашечки это. - teap0t(24.09.2020 17:31 - 17:40)
- И вопрос такой - а где находится этот костыль? Ты решил менять
файлы библиотек? - RxTx(25.09.2020 02:10)
- Можешь аргументированно объяснить, зачем ты стремишься к полной
поддержке MISRA ? - RxTx(23.09.2020 20:07)
- Уже пояснял, но повторю. Я учусь сейчас (в смысле "не
переучиваюсь"). У меня нет привычек и пристрастий, от которых
больно и неудобно отказываться. Я "чистый лист", на который можно
писать что угодно. Посему нет никаких оснований избегать правил
MISRA, потому что я, лично я, от этих ограничений ничего не теряю и
ни от чего не отказываюсь. Люди даже на браинфаке программируют, а
здесь просто некоторый набор вполне разумных правил. К тому же,
выясняя причины ошибок, teap0t(532 знак., 23.09.2020 21:11)
- Это понятно, но с другой стороны это как пробовать алкогольные напитки сразу с неразведённого спирта - получишь отвращение или не верное представление. symbions(13 знак., 24.09.2020 15:48)
- Если упарываться по анализу кода на всевозможные Rule-чекеры, то не на одном только MISRA свет клином сошелся. Есть standalone версия PVS-Studio (ее можно использовать free), она также как MISRA-чекер чекает код на отсутствие потенциальных ошибок. Или есть Clang Static Analyzer. RxTx(410 знак., 24.09.2020 01:54, ссылка, ссылка)
- Это очень хорошая мотивация. А спросил я потому что переживательно на все это смотреть. (в полушутку) Ты как бы сам прищемляешь себе, и потом от этого же страдаешь.... Некий такой (со стороны) мазохизм... :)) Но окей, ладно. Каждый как говорится, д..чит как он хочет. В C++ тебя ждут еще несколько тысяч правил, масса cookbook'ов "так не делайте, а делайте так" (а через 5 лет выясняется что делать надо было совершенно наборот) и всяких занятнейших штук. - RxTx(24.09.2020 01:48)
- Кстати, по поводу заголовочных файлов - главное не забыть включить заголовок в свой Сишный файл! Из трех месяцев один день можно исключить ;) - VLLV(23.09.2020 22:55)
- Уже пояснял, но повторю. Я учусь сейчас (в смысле "не
переучиваюсь"). У меня нет привычек и пристрастий, от которых
больно и неудобно отказываться. Я "чистый лист", на который можно
писать что угодно. Посему нет никаких оснований избегать правил
MISRA, потому что я, лично я, от этих ограничений ничего не теряю и
ни от чего не отказываюсь. Люди даже на браинфаке программируют, а
здесь просто некоторый набор вполне разумных правил. К тому же,
выясняя причины ошибок, teap0t(532 знак., 23.09.2020 21:11)
- #13 Народ, гляньте, у кого IAR есть, что написано в #define assert_param (в каком-то из заголовочных файлов) в вашей версии. В 5.20 код
выглядит так: teap0t(626 знак., 23.09.2020 20:01)
- IAR 7.40 VLLV(1043 знак., 23.09.2020 22:57)
- Да, добавили "U", но это ни на что не влияет. Нашёл по ссылке. Но указанный там способ тоже не того. - teap0t(24.09.2020 09:35, ссылка)
- IAR 7.40 VLLV(1043 знак., 23.09.2020 22:57)
- #12 MISRA. Имеется куча ошибок (кстати в библиотеке периферии, про
которую ST заявляет, что она совместима с сабжем). Error[Pm049]: all non-null statements shall have a side-effect
(MISRA C 2004 rule 14.2). Ругань идёт на следующий фрагмент: teap0t(414 знак., 23.09.2020 08:32)
- Очевидно, что если не "#ifdef USE_FULL_ASSERT", то получается
"(void)0;", и это то самое "a non-null statement without any side
effects". Могли бы в этом случае сделать пустой макрос для
assert_param(), и нарушение уйдёт. - SciFi(23.09.2020 08:49)
- "Папа, а что такое пресс-папье?" Я с макросами никогда не работал
(и в ассемблере тоже), ибо никогда не мог (не пытался) разобраться,
как они работают. Пустой макрос как выглядит? - teap0t(23.09.2020 08:51)
- Пустой макрос "#define assert_param(expr)". Он заменяет в коде
assert_param(всякое_разное) на пустоту. Макросы -- это простая
тема. Текстовые подстановки, но с нюансами, конечно. - SciFi(23.09.2020 08:54)
- Добавил такую строку в компилируемый файл получил ошибку Error[Pm050]: a null statement shall only occur on a line by
itself, and shall not have any other text on the same line (MISRA C
2004 rule 14.3). Т.е. имеем файл "*.c" со строками: teap0t(1438 знак., 23.09.2020 09:41 - 10:05)
- Заведите уже себе текстовый редактор с навигацией по коду. Тогда
assert_failed() искать вообще не пришлось бы. В 21 веке жить без
нормального текстового редактора неприлично. - SciFi(23.09.2020 11:02)
- IAR кажет, но надо ещё и не забывать, что такая возможность есть. С этим труднее. - teap0t(23.09.2020 19:40)
- Ну что тут можно сказать? Мисра и ассерт несовместимы. - SciFi(23.09.2020 09:41)
- Не, ну есть же версия, которая удовлетворяет требованиям. Правда ей
нужны файлы из запасов компилятора. Кстати вопрос. Задать USE_FULL_ASSERT на закладке препроцессора я могу. Т.е. после такой записи этот
переключатель как бы в состоянии "ЕСТЬ" А как на этой закладки
задать противоположное состояние "НЕТ"? Просто ничего не писать? teap0t(1 знак., 23.09.2020 09:45 - 09:52, картинка)
- Просто ничего не писать. А как "удовлетворяет требованиям" --
непонятно, потому что требования драконовские. - SciFi(23.09.2020 09:48)
- OK. - teap0t(23.09.2020 09:53)
- Просто ничего не писать. А как "удовлетворяет требованиям" --
непонятно, потому что требования драконовские. - SciFi(23.09.2020 09:48)
- Не, ну есть же версия, которая удовлетворяет требованиям. Правда ей
нужны файлы из запасов компилятора. Кстати вопрос. Задать USE_FULL_ASSERT на закладке препроцессора я могу. Т.е. после такой записи этот
переключатель как бы в состоянии "ЕСТЬ" А как на этой закладки
задать противоположное состояние "НЕТ"? Просто ничего не писать? teap0t(1 знак., 23.09.2020 09:45 - 09:52, картинка)
- Заведите уже себе текстовый редактор с навигацией по коду. Тогда
assert_failed() искать вообще не пришлось бы. В 21 веке жить без
нормального текстового редактора неприлично. - SciFi(23.09.2020 11:02)
- Добавил такую строку в компилируемый файл получил ошибку Error[Pm050]: a null statement shall only occur on a line by
itself, and shall not have any other text on the same line (MISRA C
2004 rule 14.3). Т.е. имеем файл "*.c" со строками: teap0t(1438 знак., 23.09.2020 09:41 - 10:05)
- Пустой макрос "#define assert_param(expr)". Он заменяет в коде
assert_param(всякое_разное) на пустоту. Макросы -- это простая
тема. Текстовые подстановки, но с нюансами, конечно. - SciFi(23.09.2020 08:54)
- "Папа, а что такое пресс-папье?" Я с макросами никогда не работал
(и в ассемблере тоже), ибо никогда не мог (не пытался) разобраться,
как они работают. Пустой макрос как выглядит? - teap0t(23.09.2020 08:51)
- А я не помню, MISRA лезет в некомпилируемый код? USE_FULL_ASSERT
определен? - VLLV(23.09.2020 08:36)
- Я попытался задать #define USE_FULL_ASSERT 0 или 1 непосредственно в компилируемом файле , но реакция нулевая.
Так. Если перенести определение ассерта прямо в компилируемый файл,
то ошибки пропадают. Что-то с заголовочными файлами. - teap0t(23.09.2020 08:42)
- Ты этот #define должен был ставить еще до #include - RxTx(23.09.2020 20:08)
- Само собой. Но я, как американец, сначала попробовал и другой вариант. - teap0t(23.09.2020 20:58)
- #ifdef - проверяет было ли определение вообще с любым значением или
без него, проверяй с помощью #if Дoктyp77(42 знак., 23.09.2020 08:46, )
- Эх. Ладно, почитаю. - teap0t(23.09.2020 08:52)
- И по макросам если упарываешься, полезно будет либо суметь напечатать значение макроса RxTx(479 знак., 24.09.2020 02:19, ссылка)
- Скажем, можно здесь: - RxTx(24.09.2020 02:03, ссылка)
- ОК. - teap0t(24.09.2020 09:50)
- Эх. Ладно, почитаю. - teap0t(23.09.2020 08:52)
- Ты этот #define должен был ставить еще до #include - RxTx(23.09.2020 20:08)
- Я попытался задать #define USE_FULL_ASSERT 0 или 1 непосредственно в компилируемом файле , но реакция нулевая.
Так. Если перенести определение ассерта прямо в компилируемый файл,
то ошибки пропадают. Что-то с заголовочными файлами. - teap0t(23.09.2020 08:42)
- Очевидно, что если не "#ifdef USE_FULL_ASSERT", то получается
"(void)0;", и это то самое "a non-null statement without any side
effects". Могли бы в этом случае сделать пустой макрос для
assert_param(), и нарушение уйдёт. - SciFi(23.09.2020 08:49)
- #14 Сделал такой костыль, после чего ошибки компиляции исчезли. "Done. 0 error(s), 0 warning(s) ". Не откажите в любезности, гляньте, правильно ли? teap0t(753 знак., 24.09.2020 17:26)