MISRA C ++ - 2008规则5-0-15 - 数组索引应该是指针算术的唯一形式

时间:2015-12-01 07:57:41

标签: c++ pointers misra

我需要有更多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。

3 个答案:

答案 0 :(得分:2)

我觉得&#34;对于&#34;应该有&#34; i + 3&#34;

的条件

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

这可以解决问题。 如果它解决了,请告诉我。

答案 1 :(得分:1)

您的代码没有问题。它根据需要使用数组索引。您的静态分析仪坏了。

答案 2 :(得分:-1)

好的,我找到了一种方法:

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;
}