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.

0

Решение

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

1

Другие решения

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

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

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

2

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

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;
}
-1
По вопросам рекламы [email protected]