主要内容

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

MISRA C:2012 Rule 11.3

A conversion shall not be performed between a pointer to object type and a pointer to a different object type

描述

规则定义

A conversion shall not be performed between a pointer to object type and a pointer to a different object type 1 .

理由

如果将指向一个对象的指针转换为指向另一个对象的指针,则结果指针可能会对齐错误。不正确的对齐会导致未定义的行为。

即使转换产生了一个对齐正确的指针,但如果该指针用于访问对象,则行为可能是未定义的。

作为例外,MISRA C:2012 标准允许将指向非 atomic 限定对象类型的指针转换为指向以下类型之一的指针:

  • char

  • signed char

  • unsigned char

故障排除

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

示例

全部展开

signed   char *p1;
unsigned int *p2;

void foo(void){ 
  p2 = ( unsigned int * ) p1;     /* Non-compliant */				
}

在此示例中,p1 可以指向一个 signed char 对象。然而,p1 被转换为指向更宽类型对象 unsigned int 的指针。

extern unsigned int read_value ( void );
extern void display ( unsigned int n );

void foo ( void ){
  unsigned int u = read_value ( );
  unsigned short *hi_p = ( unsigned short * ) &u;    /* Non-compliant  */	
  *hi_p = 0;                                         
  display ( u );                                     
}

在此示例中,uunsigned int 变量。&u 被转换为指向更窄类型对象 unsigned short 的指针。

在大端字节序的机器上,语句 *hi_p = 0 试图清除由 &u 指向的内存位置的高位。但是,从 display(u) 的结果来看,您可能会发现高位未被清除。

typedef struct {
	int iNum1;
}A;

typedef struct {
	int iNum2;
}B;

void bar(A*);

void foo() {
	B wrappedNum2;
	bar(&wrappedNum2); /* Noncompliant*/

}

在此示例中,B 类型 struct 对象 wrappedNum2 在调用 bar 时被隐式转换为 A 类型 struct 对象。Polyspace® 标记了隐式转换。

const short *p;
const volatile short *q;
void foo (void){
  q = ( const volatile short * ) p;  /* Compliant */								
}

在此示例中,pq 都可以指向 short 对象。它们之间的转换仅添加了一个 volatile 修饰符,因此是合规的。

检查信息

组:指针类型转换
类别:必需
AGC 类别:必需

版本历史记录

在 R2014b 中推出

全部展开


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.