MISRA C++-2008 Правило 5-0-15. Индексация массива должна быть единственной формой арифметики указателей.

Мне нужен кто-то, у кого больше опыта работы с MISRA, чтобы помочь мне решить эту проблему. У меня есть следующий код:

byte* buf = new(std::nothrow) byte[bufferSize];

.....
for (uint32_t i = 0; i < bufferSize; i+=4)
{

..............
                        {
buf[ i+0 ] = b;
buf[ i+1 ] = g;
buf[ i+2 ] = r;

(1) Event misra_violation:  [Required] MISRA C++-2008 Rule 5-0-15 violation: Array indexing shall be the only form of pointer arithmetic.
buf[ i+3 ] = a;

}

Правило MISRA 5-0-15 не допускает использования ptr++ или ptr--. Каким должен быть подход для увеличения/уменьшения и присвоения значений с использованием указателей, созданных new?

Мой чекер MISRA - Coverity 7.0.3.3.


person Baj Mile    schedule 01.12.2015    source источник
comment
Похоже на ошибку в вашей программе проверки MISRA.   -  person n. 1.8e9-where's-my-share m.    schedule 01.12.2015
comment
Пожалуйста, назовите, какой инструмент вы используете, чтобы их публично опозорили. Кажется, это лучший способ заставить все эти дерьмовые инструменты либо улучшиться, либо уйти с рынка.   -  person Lundin    schedule 01.12.2015
comment
Ваш цикл заканчивается в конце буфера, если только bufferSize не кратно 4   -  person M.M    schedule 01.12.2015
comment
Что такое b,g,r,a? Возможно, a не то, что вы думаете.   -  person M.M    schedule 01.12.2015
comment
Чтобы убедиться, что ошибка в коде или в анализаторе, опубликуйте MCVE, который показывает ту же проблему.   -  person M.M    schedule 01.12.2015
comment
Я использую Coverity 7.0.3.3, думаю, он немного устарел.   -  person Baj Mile    schedule 01.12.2015
comment
Coverity — это инструмент для проверки ошибок, но я полагаю, что в наши дни каждый инструмент и его мать претендуют на MISRA. Получите настоящий инструмент проверки MISRA.   -  person Veriloud    schedule 01.12.2015
comment
Ошибка явно указывает на индексацию массива как на нарушение MISRA, но здесь нет нарушения правила индексации массива. Нет необходимости публиковать еще один пример, чтобы увидеть это. Конечно, может случиться так, что инструмент обнаружил другую ошибку, но отображает неправильное сообщение, но, тем не менее, инструмент все еще неисправен.   -  person Lundin    schedule 01.12.2015


Ответы (3)


С вашим кодом проблем нет. При необходимости он использует индексацию массива. У вас сломался статический анализатор.

person Lundin    schedule 01.12.2015

Я чувствую, что «для» должно иметь условие с «i + 3».

for (uint32_t i = 0; i+3 < bufferSize; i+=4)

Это может решить проблему. Дайте мне знать, если это решит.

person Gladvin    schedule 24.03.2017
comment
Не могли бы пояснить решение?) - person Rocketq; 24.03.2017
comment
Внутри цикла for мы обращаемся к элементу i+3 (также мы увеличиваем цикл i+=4), это означает, что мы должны проверять, удовлетворяет ли i+3 размеру буфера. Простите за опоздание. - person Gladvin; 18.07.2018

Хорошо, я нашел способ, как это работает:

byte* buf = new(std::nothrow) byte[bufferSize];
.....
for (uint32_t i = 0; i < bufferSize; i+=4)
{
  ..............           
  uint32_t k = i;
  buf[k] = b;
  k++;
  buf[k] = g;
  k++;
  buf[k] = r;
  k++;
  buf[k] = a;
}

Похоже, что MISRA не нравится, когда индексная арифметика находится внутри скобок []. Я не уверен, что это не ошибка в инструменте, возможно, это исправлено в более новых инструментах Coverity.

Следующее НЕ работает (MISRA снова жалуется на нарушение правила 5-0-15):

byte* buf = new(std::nothrow) byte[bufferSize];
.....
for (uint32_t i = 0; i < bufferSize; i+=4)
{
  ..............           
  uint32_t k = i;
  buf[k++] = b;
  buf[k++] = g;
  buf[k++] = r;
  buf[k++] = a;
}
person Baj Mile    schedule 01.12.2015
comment
Ваш исходный код был в порядке, не нужно было ничего менять. Второй пример в этом ответе нарушает другое (очень разумное) правило MISRA: никогда не смешивайте оператор ++ с другими операторами в одном выражении. - person Lundin; 01.12.2015
comment
В частности: не изменяйте код, если вы сами не понимаете правила MISRA. Слепое следование предупреждениям дрянного статического анализатора приведет к большему количеству ошибок, более опасной практике и худшему коду, чем то, что у вас было изначально. Поверьте мне, я видел, как это происходит много раз. Прочтите и поймите правило MISRA, прежде чем вносить изменения в код. Если вы не понимаете правила, задайте другой вопрос на Stack Overflow. - person Lundin; 01.12.2015
comment
Кажется, что MISRA не нравится, когда арифметика индекса находится внутри скобок [] Очевидно, у вас нет стандарта, его 40 долларов на misra-c.com. Правило 5-0-15 гласит, что индексация массива является единственно приемлемой формой арифметики указателей. Это правило позволяет избежать явного вычисления значений указателя. - person Veriloud; 01.12.2015
comment
У меня есть /MISRA-Cpp-2008.pdf, он бесплатный, я знаю, что MISRA запрещает арифметику указателей. Таким образом, *(ptr + 5) следует заменить на ptr[5]. Также *ptr++ и *ptr-- запрещены MISRA. Но я не использую это и не понимаю, почему Coverity печатает это для выражений внутри скобок []. Мне уже ответили, что с 5-0-15 вышеприведенного кода проблем нет, но я жду подтверждения от Coverity. В целом это работает достаточно хорошо, но такие нечеткие отпечатки отнимают у разработчиков слишком много времени на расследование. - person Baj Mile; 02.12.2015