メインコンテンツ

MISRA C:2023 Rule 11.8

A conversion shall not remove any const, volatile, or _Atomic qualification from the type pointed to by a pointer

R2024a 以降

説明

ルール定義

A conversion shall not remove any const, volatile, or _Atomic qualification from the type pointed to by a pointer 1 .

根拠

このルールでは、型修飾に違反する変換を禁止しています。

  • const オブジェクトへのポインターから const オブジェクトを指さないポインターへのキャスト。const 修飾子を削除すると、プログラムが、読み取り専用になるよう意図されているオブジェクトを変更できるようになります。このように変換されたオブジェクトにアクセスしようとすると、例外が発生する場合があります。

  • volatile オブジェクトへのポインターから volatile オブジェクトを指さないポインターへのキャスト。volatile 修飾子を削除すると、コンパイラは最適化の際に、このオブジェクトへのアクセスを削除できるようになります。

  • _Atomic オブジェクトへのポインターから _Atomic オブジェクトを指さないポインターへのキャスト。_Atomic 修飾子を削除すると、プログラムがオブジェクトのロック状態を回避できるようになり、メモリ破損が発生します。

Polyspace 実装

Polyspace® はこのルールに違反している暗黙的な変換および明示的な変換の両方にフラグを立てます。

トラブルシューティング

ルール違反を想定していてもその違反が表示されない場合、コーディング規約違反が想定どおりに表示されない理由の診断を参照します。

すべて展開する

void foo(void) {

    /* Cast on simple type */
    unsigned short           x;
    unsigned short * const   cpi = &x;  /* const pointer */
    unsigned short * const  *pcpi;   /* pointer to const pointer */
    unsigned short **ppi;
    const unsigned short    *pci;    /* pointer to const */
    volatile unsigned short *pvi;    /* pointer to volatile  */
    unsigned short          *pi;

    pi = cpi;                        /* Compliant - no cast required */
    pi  = (unsigned short *)  pci;   /* Non-compliant */
    pi  = (unsigned short *)  pvi;   /* Non-compliant */
    ppi = (unsigned short **)pcpi;   /* Non-compliant */
}

この例では以下のようになります。

  • 変数 pcipcpi はその型に const 修飾子をもつ。変数が const 修飾子をもたない型にキャストされる場合、ルールに違反する。

  • 変数 pvi はその型に volatile 修飾子をもつ。変数が volatile 修飾子をもたない型にキャストされる場合、ルールに違反する。

cpi がその型に const 修飾子をもつ場合でも、ステートメント pi = cpi; ではルールに違反しません。cpi が指しているオブジェクトの const の特性が、代入によって取り除かれることはありません。cpiconst オブジェクトですが、非 const オブジェクトを指しています。このような場合、Polyspace は違反を報告しません。

チェック情報

グループ: Pointer Type Conversions
カテゴリ: 必要
AGC カテゴリ: 必要

バージョン履歴

R2024a で導入


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.