主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

MISRA C:2012 Rule 18.4

The +, -, += and -= operators should not be applied to an expression of pointer type

描述

规则定义

The +, -, += and -= operators should not be applied to an expression of pointer type 1 .

理由

指针运算的首选形式是使用数组下标语法 ptr[expr]。这种语法清晰明了,比指针操作更少出错。通过指针操作,任何显式计算的指针值都有可能访问意外或无效的内存地址。数组索引也会访问意外或无效的内存,但更易于审查。

对于一位新的 C 程序员来说,表达式 ptr+1 可能会被误解为“1 加上 ptr 的地址”。然而,新的内存地址取决于指针目标的大小(以字节为单位)。这种混淆可能导致意外行为。

在谨慎使用的情况下,通过 ++ 进行指针操作可以更加自然(例如,在内存测试过程中依次访问内存位置)。

Polyspace 实现

根据 MISRA C™:2012 规范,规则检查项会标记指针运算,例如 Pointer + IntegerInteger + PointerPointer - Integer 等。

故障排除

如果您预期会出现违规,但未看到该违规,请参阅诊断为何编码规范违规未按预期显示

示例

全部展开

void fun1(void){
    unsigned char arr[10];
    unsigned char *ptr;
    unsigned char index = 0U;
    
    index = index + 1U;   /* Compliant - rule only applies to pointers */
    
    arr[index] = 0U;      /* Compliant */
    ptr = &arr[5];        /* Compliant */
    ptr = arr;
    ptr++;                /* Compliant - increment operator not + */
    *(ptr + 5) = 0U;      /* Non-compliant */
    ptr[5] = 0U;          /* Compliant */
}

此示例展示了指针和数组的各种运算。此示例中唯一不合规的运算是直接将 + 运算符与指针一起使用(第 12 行)。

void fun2(void){
    unsigned char array_2_2[2][2] = {{1U, 2U}, {4U, 5U}};
    unsigned char i = 0U;
    unsigned char j = 0U;
    unsigned char sum = 0U;
    
    for(i = 0u; i < 2U; i++){
        unsigned char *row = array_2_2[ i ];
        
        for(j = 0u; j < 2U; j++){
            sum += row[ j ];                   /* Compliant */    
        }
    }        
}

在此示例中,第二个 for 循环在算术表达式中使用数组指针 row。但是,这种用法是合规的,因为它使用了数组索引形式。

void fun3(unsigned char *ptr1, unsigned char ptr2[ ]){
    ptr1++;               /* Compliant */
    ptr1 = ptr1 - 5;      /* Non-compliant */
    ptr1 -= 5;            /* Non-compliant */
    ptr1[2] = 0U;         /* Compliant */
    
    ptr2++;               /* Compliant */
    ptr2 = ptr2 + 3;      /* Non-compliant */
    ptr2 += 3;            /* Non-compliant */
    ptr2[3] = 0U;         /* Compliant */
}

此示例显示了在指针和数组上使用的错误运算符。请注意,对于指针和数组,相同类型的表达式既可以合规,也可以不合规。

如果 ptr1 不指向至少包含六个元素的数组,且 ptr2 不指向至少包含四个元素的数组,则此示例违反了规则 18.1。

检查信息

组:指针和数组
类别:建议
AGC 类别:建议

1 All MISRA coding rules and directives are © Copyright The MISRA Consortium Limited 2021.

The MISRA coding standards referenced in the Polyspace® Bug Finder™ documentation are from the following MISRA standards:

  • MISRA C:2004

  • MISRA C:2012

  • MISRA C:2023

  • MISRA C++:2008

  • MISRA C++:2023

MISRA and MISRA C are registered trademarks of The MISRA Consortium Limited 2021.