关于MISRA:规则17.4 ,只允许用数组索引做指针运算

kjpioo   2008-12-3 09:53 楼主
规则17.4 只允许用数组索引做指针运算
按照如下方式定义数组和指针:
uint8_t a[10];
unit8_t *p;
p = a;
则*(p+5) = 0是不允许的,而p[5] = 0 则是允许的,尽管就这段程序而言,二者等价。

以下给出一段程序,读者可参照相应程序行的注释,细细品位上述规则的含义。

void my_fun(uint * _t * p1, uint8_t p2[])
{
    uint8_t index = 0;
    uint8_t *p3;
    uint8_t *p4;
    *p1 = 0;
    p1 ++;          /* 不允许, p1不是指向数组的指针 */
    p1 = p1 +5;     /* 不允许, p1不是指向数组的指针 */
    p1[5] = 0;      /* 不允许, p1不是指向数组的指针 */
    p3 = &p1[5];
    p2[0] = 0;
    index ++;
    index = index + 5;
    p2[index] = 0;    /*允许*/
    *(p2+index) = 0;  /* 不允许 */
    p4 = &p2[5];      /*允许*/
}

那如果是这样的话,是不是我就不能写像 memcpy(void* des, void * src, UINT32 len)这样的函数头,因为函数中一定会使用指针加减操作所指向的内存??
而是要写成memcpy(UINT8 des[], UINT8 src[], UINT32 len)    ???

回复评论 (2)

这是什么破规则,倒塌!~~~还让不让人活了
点赞  2008-12-6 12:39
印象中,偶的编译器是支持的哈

为什么不允许?

郁闷

。。。。

好像几个平台都可以这么写的,为啥不行?
点赞  2008-12-6 16:46
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复