MISRA-C:2012 на самом деле несколько слаб, когда дело доходит до преобразования указателей. Большинство правил разумны, они касаются того, чтобы заставить вас следовать стандарту C, не вызывать неопределенное поведение или делать универсально плохие вещи, такие как отбрасывание квалификаторов const из указателя. У вас не должно быть никаких возражений против всего этого.
Единственное спорное правило — 11.5:
Не следует выполнять преобразование из указателя на void в указатель на объект.
Я думаю, что это то, что вызывает у вас головную боль. Обоснованием являются проблемы выравнивания и преобразования между несовместимыми типами указателей, которые могут привести к неопределенному поведению.
Это правило действительно косвенно запрещает использование многих базовых библиотечных функций, таких как memcpy
. Моя личная рекомендация MISRA относительно этого правила во время обзора 2012 года была следующей:
(Совершенно не согласен) «Существует слишком много случаев общего программирования на C, когда необходимы приведения типа void указателя. Это правило непрактично и принесет больше вреда, чем пользы. Вместо этого создайте правило, запрещающее конкретную опасность, от которой оно пытается защитить». , а именно "указатель-x, приведенный к void*, приведенный к указателю-y"."
Но они не послушались, и вот оно: бесполезное правило, которое заставляет каждый инструмент выдавать поток ложных срабатываний. Это означает, что каждый пользователь MISRA должен игнорировать это правило. Он носит рекомендательный характер, поэтому вы можете игнорировать его, не вызывая никаких процедур отклонения. Просто заблокируйте его в своем статическом анализаторе и двигайтесь дальше.
Комитету MISRA еще только предстоит осознать, что ложные срабатывания сами по себе представляют угрозу безопасности, поскольку они могут привести к тому, что люди начнут переписывать идеальный код и, таким образом, внесут ошибки.
как мисра ожидает malloc
MISRA ожидает, что вы вообще не будете использовать malloc, это явно запрещено директивой 4.12 по очень веским причинам. Но это другая тема.
person
Lundin
schedule
18.02.2016
memcpy
илиmalloc
. - person Keith Thompson   schedule 17.02.2016malloc
, что означает, что ответ будет Это не так я>. - person Michael   schedule 17.02.2016void *
к/от других указателей в C. C - это не C++. А AFIK MISRA даже не разрешает (или, по крайней мере, настоятельно не рекомендует) вообще использовать динамическое выделение памяти. - person too honest for this site   schedule 17.02.2016malloc
илиmemcpy
.) - person Keith Thompson   schedule 17.02.2016to
иfrom
НЕ нужно приводить к типу void, чтобы вызывать memcpy или malloc - person M.M   schedule 17.02.2016