обоснование Misra 2012, не допускающего приведения между разными указателями

В настоящее время я работаю над проектом, который требует, чтобы код был совместим с Misra 2012. На протяжении всего проекта у нас есть много необходимых предупреждений misra, говорящих нам, что мы не можем преобразовать указатель на один тип в указатель на другой тип. Такие простые вещи, как void *memcpy(void *to, const void *from, size_t n), выдают два предупреждения Misra Required, поскольку и to, и from должны быть приведены к типу void* и const void* соответственно. Преобразование из void* в указатель любого другого типа также дает предупреждение Misra.

Мой вопрос: как Misra ожидает, что malloc и все остальное будут работать без каких-либо предупреждений? Даже преобразование буфера void* в буфер uint8_t* для разбора буфера побайтно и заполнения всех элементов структурной структуры вызовет многочисленные предупреждения?

Вместо этих предупреждений не может ли он просто показать примечание или информацию с просьбой дважды проверить упаковку, выравнивание и все остальное, что может пойти не так?


person thunderbird    schedule 17.02.2016    source источник
comment
Запрещает ли MISRA неявные преобразования, явные приведения или и то, и другое? (Примечание по терминологии: приведение — это явный оператор; неявное преобразование — это не приведение.) Вам не нужно приведение для вызова memcpy или malloc.   -  person Keith Thompson    schedule 17.02.2016
comment
Что это за штука МИСРА? Если это не позволяет вам предоставить указатель на что-то, когда ожидается void*, это просто неправильно.   -  person SergeyA    schedule 17.02.2016
comment
как Misra ожидает, что malloc и все остальное будут работать без каких-либо предупреждений? Исходя из того, что я могу найти, вы не должны использовать malloc, что означает, что ответ будет Это не так.   -  person Michael    schedule 17.02.2016
comment
Вы можете ознакомиться с официальной документацией по адресу misra.org.uk У каждого правила есть свое обоснование.   -  person Ismael Infante    schedule 17.02.2016
comment
@KeithThompson как неявные, так и явные приведения вызовут ошибку. И в большинстве случаев код даже не будет компилироваться для неявного приведения (если только не используется void*).   -  person thunderbird    schedule 17.02.2016
comment
Вы не должны приводить void * к/от других указателей в C. C - это не C++. А AFIK MISRA даже не разрешает (или, по крайней мере, настоятельно не рекомендует) вообще использовать динамическое выделение памяти.   -  person too honest for this site    schedule 17.02.2016
comment
хорошо, распределение памяти было просто примером. Похоже, что Misra полностью запрещает любое приведение типов указателей.   -  person thunderbird    schedule 17.02.2016
comment
Хотя вы вряд ли сможете избежать всех приведений типов, в целом рекомендуется использовать приведение типов только в том случае, если они действительно необходимы. Правильно спроектированный интерфейс редко нуждается в приведении типов, особенно указателей (еще одна проблема — приведение типов со знаком/без знака).   -  person too honest for this site    schedule 17.02.2016
comment
В C нет такой вещи, как неявное приведение типов, и в стандарте не используется термин typecast. Приведение слова применяется только к явному оператору, записанному как имя типа в скобках. Можете ли вы обновить вопрос, указав фактическое требование? (Если неявные преобразования указателей запрещены, я не понимаю, как вы могли бы использовать malloc или memcpy.)   -  person Keith Thompson    schedule 17.02.2016
comment
to и from НЕ нужно приводить к типу void, чтобы вызывать memcpy или malloc   -  person M.M    schedule 17.02.2016
comment
@M.M, конечно, нет, но Мисра выдаст предупреждения, если вы это сделаете.   -  person thunderbird    schedule 17.02.2016
comment
@KeithThompson да, похоже, malloc и memcpy не должны использоваться   -  person thunderbird    schedule 17.02.2016
comment
Что точно говорит фактическое требование MISRA? Точная формулировка может быть важна.   -  person Keith Thompson    schedule 17.02.2016
comment
Википедия предполагает, что MISRA в любом случае не разрешает использование malloc   -  person M.M    schedule 17.02.2016
comment
Даже Microsoft запрещает memcpy. blogs.microsoft.com/cybertrust/2009/05/14/   -  person Adrian McCarthy    schedule 18.02.2016
comment
Вы должны опубликовать конкретные правила MISRA, о которых вы спрашиваете (они пронумерованы, и любое предупреждение должно содержать этот номер), и вы должны опубликовать пример кода, который генерирует сообщение о нарушении правил. В противном случае существует вероятность большой путаницы (как видно из длинного следа комментариев...).   -  person Michael Burr    schedule 18.02.2016
comment
MISRA-C:2012 явно не C++, поэтому я удаляю этот тег.   -  person Lundin    schedule 18.02.2016
comment
а причина удаления тега Lint была?   -  person Veriloud    schedule 19.02.2016


Ответы (3)


Я хотел бы вернуться к тому, что спросил ОП, и уточнить несколько вещей. Во-первых, нет проблем с вызовом void *memcpy(void *to, const void *from, size_t n), поскольку преобразование указателя на объект в указатель void не нарушает никаких рекомендаций MISRA-C:2012. Другими словами, любой инструмент, производящий нарушения для этого, просто глючит.

Во-вторых, прежде чем прийти к какому-либо выводу, важно прочитать, что на самом деле говорит Правило 11.5, соответствующее руководство MISRA-C:2012, а именно:

  Rule 11.5
  A conversion should not be performed from pointer to void into
  pointer to object

  Category Advisory
  Analysis Decidable, Single Translation Unit
  Applies to C90, C99

  Rationale
  Conversion of a pointer to void into a pointer to object may result
  in a pointer that is not correctly aligned, resulting in undefined
  behaviour. It should be avoided where possible but may be necessary,
  for example when dealing with memory allocation functions. If
  conversion from a pointer to object into a pointer to void is used,
  care should be taken to ensure that any pointers produced do not
  give rise to the undefined behaviour discussed under Rule 11.3.

Наблюдения:

  1. это рекомендательное правило (т. е. не обязательное и не обязательное), поэтому от него можно отклоняться, и MISRA определил правильный процесс отклонения;
  2. преобразование указателя на объект в указатель на void — это нормально, а наоборот проблематично;
  3. в обосновании явно упоминаются функции выделения памяти (и да, программу, использующую динамическое выделение памяти, можно привести в соответствие с MISRA-C:2012);
  4. обоснование дает руководство о том, что делать при преобразовании указателей на объекты в указатели на пустоту, что полностью соответствует тому, что хотел бы иметь OP («информация с просьбой дважды проверить упаковку, выравнивание и все остальное, что может пойти не так»).
person Roberto Bagnara    schedule 29.02.2016

Это не отвечает на ваш вопрос, который касается обоснований. Скорее, это указывает на то, что вы не должны быть в такой ситуации в первую очередь.

Ввод «misra malloc» в вашу любимую поисковую систему приводит нас к:

http://www.misra.org.uk/forum/viewtopic.php?t=260

который спрашивает:

Согласно правилу, мы не должны использовать такие функции, как malloc(), free(), calloc() и т. д. Но malloc() является очень распространенным требованием. Большинство встроенных системных приложений используют свои собственные диспетчеры памяти на уровне приложений, чтобы ускорить выделение и освобождение памяти. Есть ли у вас какие-либо предложения по решению этой проблемы (если мы не можем использовать malloc каким-либо другим способом)?

И ответ таков:

Нас спрашивали о решениях и обходных путях для различных вещей, которые запрещены как в MISRA C1, так и в MISRA C2, таких как использование malloc, calloc и т. д. для динамического выделения памяти. Ни MISRA, ни любой член рабочей группы MISRA C не будет давать никаких указаний или одобрений в отношении каких-либо отклонений или «обходных путей».


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

Например, вы упоминаете memcpy. Это не соответствует требованиям. Так что сделайте шаг назад и спросите: «Предположим, у меня нет никакой реализации memcpy. Как мне написать свою собственную memcpy, которая была бы совместима?» Вы используете memcpy для решения проблемы; решить проблему без него.

Теперь сделайте то же самое для malloc. Был день, когда malloc не существовало, и кто-то должен был написать его без malloc. У вас есть проблема, которую решает malloc. Если бы у вас не было malloc, как бы вы ее решили? В malloc нет ничего волшебного; вы можете написать свой собственный, который работает лучше, чем malloc, где под «лучше» я имею в виду «соответствует вашим требованиям».

person Eric Lippert    schedule 17.02.2016
comment
на самом деле мы используем динамическое выделение только один раз, а затем управляем им на протяжении всего жизненного цикла приложения, поэтому мы как бы избегаем многократного выделения динамической памяти. Есть и другие проблемы, такие как передача общих межзадачных сообщений, анализ данных, полученных через сетевой интерфейс, и так далее и тому подобное. Почему-то, пытаясь соответствовать Misra, у меня не возникает ощущения, что мы на самом деле делаем наш код более надежным и лучшим и сильно теряем эффективность. - person thunderbird; 17.02.2016
comment
@thunderbird: часто соответствие стандарту, не узко адаптированному к вашему конкретному приложению, накладывает затраты как на усилия, так и на эффективность. Вопрос о том, стоят ли затраты выгоды, должен решаться совместно вами и заинтересованными сторонами проекта на основе информированной оценки как затрат, так и выгод. Уступчивость не хороша сама по себе; это потому, что есть хорошие результаты. Если вы не получаете эти хорошие результаты по разумной цене, то отступите. - person Eric Lippert; 17.02.2016
comment
@thunderbird, вся идея таких стандартов состоит в том, чтобы продвигать правильность, а не эффективность. Медленно и устойчиво бьется быстро, но иногда падает. (Я сомневаюсь, что вы все равно найдете какую-либо измеримую разницу в скорости выполнения, например, для сериализации данных переносимым способом по сравнению с преобразованием буферов char в структуры) - person M.M; 17.02.2016
comment
@ М.М., это, конечно, неправда. Существует огромная разница в производительности между сериализацией с идентификационным кодированием и любой гибкой сериализацией. Видел своими глазами. - person SergeyA; 17.02.2016
comment
Ok. Используйте 1_. Но сериализация удостоверений в любом случае является проблемой, потому что, когда вы меняете свою структуру в более поздней версии кода, вам нужно написать кучу BS, чтобы иметь возможность загружать более ранние версии файла сохранения, а затем есть случай, когда структура содержит указатели... - person M.M; 17.02.2016
comment
@SergeyA: Верно, есть хороший пример. Если затраты на производительность превышают безопасность, то вы можете привести принципиальный, основанный на данных аргумент в пользу того, что код сериализации должен быть изолирован в собственной изолированной подсистеме, которая тщательно проверяется и освобождается от ваших требований. политика. Политика — наши слуги; заставь свою работать на достижение твоих целей. - person Eric Lippert; 18.02.2016
comment
@ ММ, ну, ты всегда можешь изменить свою структуру, добавив поля в конце. И сериализация удостоверений имеет хорошее место для своих целей. Если вы мне не доверяете, позвоните в NASDAQ и спросите их, почему у них есть протокол Ouch. - person SergeyA; 18.02.2016
comment
На самом деле мне потребовалось некоторое время, чтобы прочитать рекомендации MISRA. Выглядит очень специфически и очень далеко от моей области, поэтому я не могу их комментировать. Я не уверен, как можно написать программу без использования какой-либо формы управления памятью... но, возможно, это возможно. - person SergeyA; 18.02.2016
comment
@SergeyA: Вы, безусловно, можете писать сложные программы без управления кучей. Существуют виртуальные машины или, если уж на то пошло, физические машины, которые вообще не имеют кучи, и они выполняют полезную работу. Опять же: представьте, что вы жили в мире без malloc; что бы ты сделал? Менеджеры памяти написать не так сложно; Я попросил кандидатов на собеседовании нарисовать на доске реализацию одного из них. - person Eric Lippert; 18.02.2016
comment
@EricLippert, ты можешь написать свой собственный malloc, в этом нет сомнений. Но любая его версия вернет void* — это единственное, что может вернуть обобщенный менеджер памяти. И преобразование из void* в указатель типа не разрешено Misra, судя по комментариям выше. Что теперь? - person SergeyA; 18.02.2016
comment
@SergeyA: Кто сказал что-нибудь о написании универсального менеджера памяти? Вам нужен блок целых чисел, напишите диспетчер памяти, предназначенный для создания блока целых чисел. Обобщенные менеджеры памяти представляют собой кучу опасностей; весь смысл этого стандарта состоит в том, чтобы избежать этой опасности, а не повторно реализовать ее. - person Eric Lippert; 18.02.2016
comment
@EricLippert, что, если мне нужны блоки целых чисел, двойных чисел, коротких целых чисел, чисел с плавающей запятой, символов, структур Foo, Bar и Baz, перечислений, целых чисел без знака - нужно ли мне столько специализированных менеджеров? - person SergeyA; 18.02.2016
comment
@SergeyA: Вот ваш выбор: (1) использовать язык с надлежащей системой типов и средой выполнения, обеспечивающей безопасность памяти, оплачивая связанные с ними затраты на производительность. (2) Использовать язык с дерьмовой системой типов, которая позволяет преобразовывать любую ссылку в любую другую ссылку, писать код, использующий void* в качестве прокси для любого типа, платить за ошибки, настолько ужасные, что у вас выпадают волосы, или (3) использовать язык с дерьмовой системой типов, избегать void*, писать много скучного кода. Я выбираю (1), но это потому, что такие языки более чем удовлетворяют мои потребности. - person Eric Lippert; 18.02.2016
comment
Рекомендации MISRA предназначены для критически важных систем (на карту могут быть поставлены жизни людей), обычно работающих с ограниченными системными ресурсами (ограниченный объем ОЗУ, без виртуальной памяти), которые должны работать бесконечно. Подумайте о компьютерах управления двигателями, медицинских приборах, космических кораблях. Запрет на приведение указателей позволяет получить максимальную отдачу от системы проверки типов. Запрет на динамическое выделение памяти устраняет возможность фрагментации или утечек памяти, вызывающих сбой в устойчивом состоянии. - person Adrian McCarthy; 18.02.2016
comment
@EricLippert, если ваш выбор равен 1), что вы делаете в теге C ++? - person SergeyA; 18.02.2016
comment
@SergeyA: я открыто признаю, что я не эксперт по C++, поскольку никогда не писал ни одного компилятора C++; Я когда-либо писал компиляторы для других языков только на C++. Вы действительно не знаете язык, пока не напишете для него пару компиляторов. Тем не менее, я думаю, что могу время от времени добавлять некоторую ценность по этому вопросу. - person Eric Lippert; 18.02.2016
comment
@ Адриан, это правда, но есть люди, которые используют MISRA-C: 2012 в игровых системах, это не только критические системы, иначе они не должны использовать lint, вы согласны? - person Veriloud; 18.02.2016
comment
@Veriloud: Вопрос в обосновании некоторых правил, а правила были написаны для критических систем. Официальное название правил — Рекомендации по использованию языка C в критических системах. Люди, использующие эти рекомендации для вещей, которые не являются критически важными системами, не имеют отношения к обоснованию правил. - person Adrian McCarthy; 19.02.2016
comment
@ Адриан, независимо от названия, вы понимаете, что оригинальные правила MISRA-C вышли из телекоммуникационной отрасли (человек, работающий в BT)? Они также основаны на многих других более безопасных стандартах C (например, Les Hatton) и, конечно же, на ловушках и подводных камнях Кенига (из AT&T Bell Labs), а также на самих стандартах C, специфичных для тех областей языка C, которые непредсказуемы (undefined). , неспецифические и специфичные для реализации), включая фольклорные правила прошлых стандартов MISRA, которые были понижены или устранены - т.е. нет, обоснование применимо ко всем разработкам c. - person Veriloud; 19.02.2016
comment
@Veriloud: это не тот форум для этого разговора. Контекст этого вопроса касается обоснования конкретных руководств MISRA. Руководство было написано для критических систем. Вопрос о том, имеет ли смысл применять некоторые из этих рекомендаций в некритических системах, здесь не рассматривается. - person Adrian McCarthy; 19.02.2016
comment
@ Адриан, я раньше работал в компании, которая первоначально представила рекомендации, я мог бы знать. Кстати, откуда вы знаете, что контекст Thunderbird критичен для безопасности (в конце концов, lint обычно не используется в этой области)? Я не согласен, что это не по теме, и соображения, которые предоставил СергейА, также по теме. Многие пользователи применяют MISRA-C, которые не являются критическими с точки зрения безопасности, поэтому MISRA-C:2012 получает более широкое распространение, и в будущем будет задано больше этих вопросов из некритического контекста. - person Veriloud; 19.02.2016

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
comment
@SergeyA Очевидно, со статическим или локальным распределением. (Этот вопрос является одним из таких примеров.) В этом нет ничего уникального для MISRA, все стандарты безопасности запрещают использование динамического выделения памяти в куче. - person Lundin; 18.02.2016
comment
Чем он отличается от «кучи»? Насколько выделение из static char pool[gazzilion] с помощью собственного распределителя безопаснее, чем использование стандартной функции, предоставленной языком, проверенной годами и отшлифованной, проверенной множеством глаз? - person SergeyA; 18.02.2016
comment
@SergeyA Динамическое выделение приводит к сегментации, недетерминированному времени выделения, утечкам памяти и так далее. Это на 100% лишняя, излишне раздутая функция в любой небольшой встраиваемой системе. В критически важном программном обеспечении динамическое распределение также совершенно бессмысленно, так как отсутствуют недетерминированные атрибуты. Также обратите внимание, что static type_t pool[n] используется ровно для n объектов типа type_t и ни для чего другого. В то время как malloc является полностью универсальным типом/размером и, следовательно, должен использовать сегментацию. - person Lundin; 18.02.2016
comment
Минутку. Вы также предлагаете использовать фиксированный пул для каждого типа объекта, который у меня есть в моей программе? То есть, если я использую примерно 500 типов в своем приложении, у меня получится 500 пулов? Кроме того, чем malloc отличается с точки зрения утечек от выделения из указанного пула? - person SergeyA; 18.02.2016
comment
@SergeyA Для каждого используемого вами ADT. Всякий раз, когда вам нужно использовать настоящую частную инкапсуляцию в C, что должно быть единственным случаем, когда ADT должен выполнять выделение, а не вызывающий. malloc отличается тем, что те, кто использует его ради экономии памяти, также должны активно вызывать free, и именно здесь вы можете получить ошибки. Но динамическое сохранение памяти не имеет смысла в однопроцессорной системе, поскольку вы ни с кем не делитесь памятью. Ваша куча всегда должна быть достаточно большой, чтобы соответствовать наихудшему сценарию, поэтому вы также можете статически выделить именно этот объем памяти. - person Lundin; 18.02.2016
comment
@SergeyA Подумайте об этом с другой стороны: если у вас есть один процесс в системе с определенным фиксированным объемом памяти, зачем вам использовать malloc? Не существует причин, по которым вам когда-либо понадобится это делать, см. это. - person Lundin; 18.02.2016
comment
Лундин, если вы не освобождаете (каким-либо образом) ресурсы из статически выделенных пулов, вы можете также не освобождать те, которые вы выделяете динамически. Чем он отличается? - person SergeyA; 18.02.2016
comment
Лундин, я бы использовал malloc, потому что он был протестирован больше раз, чем звезд в наблюдаемой части вселенной (моя дикая догадка в оценках). И если вы не хотите освобождать свои ресурсы, не освобождайте их, вас никто не заставляет. malloc() также является функцией, используемой другими библиотечными функциями, например, strdup. Значит, вы тоже запрещаете strdup? - person SergeyA; 18.02.2016
comment
@Lundin все стандарты безопасности запрещают использование динамического выделения памяти в куче. Слово «запрет» не подходит ни для каких правил в MISRA-C:2012, кроме обязательных, есть причина, по которой язык изменился по сравнению с предыдущими стандартами MISRA. Кроме того, «правила» составляют лишь часть всего документа, и жизненно важно, чтобы справочная информация и вопросы процесса, описанные в ведущих разделах, не игнорировались... вместо того, чтобы обращаться с инженерами как с идиотами, чтобы слепо следовать правилам (как в предыдущем версии MISRA). Вот почему у MISRA такая плохая репутация. - person Veriloud; 18.02.2016
comment
@SergeyA Просто прочитайте ссылку на пост, он все объясняет. Начнем с того, что каждый компьютер в мире не является ПК/настольным компьютером с оперативной памятью... - person Lundin; 18.02.2016
comment
@SergeyA: проблема не в том, хорошо ли протестирован malloc. Вопрос не в том, надежно ли он выполняет свои обязательства. Проблема в том, что контракт malloc ужасен с самого начала. Malloc переносит бремя тестирования с проверки того, что malloc выполняет свою работу, на проверку того, что программа, которая его использует, надежна во всех возможных путях кода, которые могут привести к нехватке памяти. Практически невозможно написать надежное программное обеспечение для такого сценария. - person Eric Lippert; 18.02.2016
comment
@EricLippert, как распределение пула решает эту проблему? Я имею в виду, что памяти не хватает. - person SergeyA; 18.02.2016
comment
@SergeyA: Хороший вопрос. Во-первых, начните с вопроса, нужно ли программе вообще динамически выделять память. Если это не так, то вам не нужен распределитель. Предположим, что это так. Как мы можем создать распределители, у которых контракты лучше, чем у malloc? Вы можете создать распределители, которые намного умнее. Например: распределители, которые знают, когда блок памяти содержит результаты, которые могут быть пересчитаны при необходимости, и, следовательно, блок может быть признан недействительным, когда памяти становится мало. - person Eric Lippert; 18.02.2016
comment
@SergeyA: Распределители, которые предоставляют услуги, выходящие за рамки просто вашей памяти, или нулевые, например, возможность запрашивать состояние доступности памяти, или сообщать, какие части системы используют, сколько ресурсов, или устанавливать ограничения на минимальные, пиковые и средние ожидаемые значения. потребление ресурсов. Я мог бы продолжать и продолжать; вы можете сделать аллокаторы намного более мощными и полезными, чем malloc, которые дают вам преимущества безопасности типов и поддающихся анализу как производительности, так и корректности. - person Eric Lippert; 18.02.2016
comment
@SergeyA: И, отвечая на ваш предыдущий вопрос, конечно, вы избавляетесь от strdup. strdup ужасен. Тот факт, что вам нужно дублировать строки вообще, является следствием ужасного дизайнерского решения сделать строки изменяемыми массивами. Тот факт, что он может произвольно выйти из строя, ужасен. Если вы хотите писать надежное программное обеспечение, то выбросьте все эти 40-летние вещи и создайте надежные, укрепленные подсистемы, правильность которых можно определить с помощью статического анализа и чьи контракты позволяют анализировать правильность всей программы. сговорчивый. - person Eric Lippert; 18.02.2016
comment
@EricLippert, сообщи мне, когда любой современный движок трехмерной игры будет написан на твоем великолепном новом языке программирования. Или программное обеспечение для высокочастотной торговли. Пока что все, что вы говорите, является принятием желаемого за действительное. - person SergeyA; 18.02.2016
comment
@SergeyA: Как я уже неоднократно говорил: стандарты существуют не просто так. Причина, по которой существуют стандарты надежности для критически важных приложений, заключается в том, чтобы обеспечить надежность критически важного программного обеспечения по определению. Среда выполнения C не была предназначена для удовлетворения этих потребностей. Если это неправильные стандарты для видеоигр, потому что они налагают неприемлемые затраты на разработку или производительность, тогда откажитесь от навязывания стандартов! - person Eric Lippert; 18.02.2016
comment
Опять же, обязательный не означает обязательный, MISRA-C:2012 может (имхо должно быть) применяться к некритическому программному обеспечению. Программирование игр может быть совместимым с MISRA, если вы будете следовать требуемым действиям процесса, которые любая приличная компания будет включать в себя тщательную экспертную оценку и документирование причин не слепых инструментов / руководств. Как я уже сказал в своем ответе, стандарт ссылается на практический мир, на который ссылается SergyA, Dir. 4.12, с. 34. Если принято решение использовать динамическую память, необходимо позаботиться о том, чтобы программное обеспечение вело себя предсказуемым образом... а затем привести примеры. - person Veriloud; 18.02.2016
comment
каждый пользователь MISRA должен игнорировать это правило [необходима цитата] Я знаю группы программного обеспечения, которые не игнорируют это правило. - person Adrian McCarthy; 19.02.2016
comment
Правило слишком широкое, и из-за фактора сигнала к шуму разработчики отключили правило в инструменте... однако, если бы правило было более конкретным (как он предложил), это принесло бы меньше вреда, чем пользы... проблема настройки инструмента, Лундин также прав, это конкретное правило не требует отклонений, но может иметь, если они примут его предложение. - person Veriloud; 19.02.2016
comment
@AdrianMcCarthy Это моя собственная вера. Я действительно не понимаю, как было бы практично писать программы, которые не могут содержать NULL, memcpy/memset/memcmp, универсальное программирование (такие функции, как bsearch, qsort) и т. д. и т. д. Я только что посмотрел предыдущий большой проект, который я сделал и проверил, что будет означать удаление void*. В частности, это означало бы, что мне пришлось бы отказаться от моей стандартной библиотеки, которая содержит соответствующие MISRA эквиваленты наиболее распространенных стандартных функций (библиотека игнорирует рекомендательное правило 11.5), и вместо этого использовать несовместимую стандартную библиотеку компилятора, которая не является ни проверенной, ни безопасной. ни портативный. - person Lundin; 19.02.2016