const спецификатор для определяемого пользователем типа данных в C

У меня есть пользовательский тип данных

typedef Unsigned int8  COMMAND_TYPE[6];

теперь у меня есть функция вроде

ConnectCommand(COMMAND_TYPE const command)
{
}

При попытке запустить проверку статического анализатора я получаю предупреждение Misra о том, что "Объект, адресованный параметром указателя "command", не изменен, поэтому указатель может иметь тип "указатель на константу""
Это нарушение правила Misra. 16,7

Хотя используется спецификатор const, и кажется, что он не виден здесь инструментом проверки правил misra, и почему?


person Omprasad    schedule 07.04.2016    source источник
comment
8-битное целое без знака   -  person Omprasad    schedule 07.04.2016
comment
@KeithThompson Вероятно, он имел в виду Это.   -  person Michi    schedule 07.04.2016
comment
@Michi: Маловероятно, это функция.   -  person Keith Thompson    schedule 07.04.2016
comment
Если на то пошло, что такое Unsigned?   -  person Keith Thompson    schedule 07.04.2016
comment
Я просто хотел указать тип данных как беззнаковое целое число 8, вот и все.   -  person Omprasad    schedule 07.04.2016
comment
Не используйте доморощенные типы (int8), которые уже есть в стандартной библиотеке. Смотрите stdint.h/inttypes.h! И имя int8 для типа unsigned вводит в заблуждение.   -  person too honest for this site    schedule 07.04.2016
comment
Вы не можете квалифицировать массив const, только его элементы.   -  person too honest for this site    schedule 07.04.2016
comment
@Omprasad Ответ может отличаться для C C++, предложите выбрать только один.   -  person chux - Reinstate Monica    schedule 07.04.2016
comment
Помимо uint8_t глупости и отсутствующего возвращаемого типа функции, я чувствую, что это вообще не настоящий код. Вы уверены, что реальная функция принимает в качестве параметра не указатель, а массив? Скопируйте/вставьте фактический код.   -  person Lundin    schedule 08.04.2016


Ответы (1)


Определенно это проблема проверки статического анализатора.

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

ConnectCommand(COMMAND_TYPE const command)
ConnectCommand(const COMMAND_TYPE command)

Хотя юридический код, использующий typedef массива, запутал вашу программу проверки. ИМО, этого это стиль дизайна, которого лучше избегать.


Создание этой вики сообщества для справки. Предложите удалить, как только появится хороший ответ.

<удар>

При просмотре я подозреваю, что проблема в Misra - она ​​дает ложное предупреждение. # 2 и # 3, прокомментированные ниже, делают то же самое. № 4 избыточен с № 2, № 3.

Я либо удалю этот ответ, либо переработаю его правильно.

Предложить попытку

typedef       Unsigned int8       COMMAND_TYPE[6];
typedef const Unsigned int8 CONST_COMMAND_TYPE[6];

void ConnectCommand(CONST_COMMAND_TYPE command) {
  ...
}

  COMMAND_TYPE c;
  ConnectCommand(c);

const в ConnectCommand(COMMAND_TYPE const command) { ...} относится к const command. command — это указатель на объекты типа COMMAND_TYPE. const command подразумевает, что указатель не должен изменяться в теле функции ConnectCommand().

"const" в предупреждении "... type pointer to const" рекомендует использовать const для типа объекта, на который на указывает command. Это связано с тем, что данные, на которые указывает command, не изменяются.

//             add              could drop this const
//              |                   |
ConnectCommand(const COMMAND_TYPE const command)

person Community    schedule 07.04.2016
comment
мой плохой, не говоря уже о том, что я попытался добавить ConnectCommand (команда const COMMAND_TYPE) и привел к той же ошибке. - person Omprasad; 07.04.2016
comment
@Omprasad Есть 4 кандидата: 1) ConnectCommand(COMMAND_TYPE command) 2) ConnectCommand(COMMAND_TYPE const command) 3) ConnectCommand(const COMMAND_TYPE command) 4)ConnectCommand(const COMMAND_TYPE const command). Приводит ли # 4 к предупреждению? Была ли в результате та же ошибка с использованием #3 точно такой же ошибкой? - person chux - Reinstate Monica; 07.04.2016
comment
@ chux: я попробовал решения № 3 и 4, которые привели к той же ошибке, что и опубликованная. На данный момент вы подозреваете, что мой инструмент статического анализатора так и делает !!! - person Omprasad; 07.04.2016
comment
@Omprasad Да, опубликовано предлагаемое решение. Проблема более высокого уровня заключается в использовании массива в качестве typedef: рекомендуется против этого. Существуют различные альтернативы. Посоветуйте, если это вариант. - person chux - Reinstate Monica; 07.04.2016