メインコンテンツ

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

MISRA C:2012 Rule 8.13

A pointer should point to a const-qualified type whenever possible

説明

ルール定義

A pointer should point to a const-qualified type whenever possible 1 .

根拠

このルールにより、誤ってポインターを使用してオブジェクトを変更しないようにします。

Polyspace 実装

ルール チェッカーは、ポインターによってその指定先のオブジェクトが変更されない場合、const 関数パラメーター以外を指すポインターにフラグを設定します。ポインターがオブジェクトを変更することは意図されていないため、ポインターは const 修飾子付きの型を指し示す必要があると仮定されます。非 const ポインターが指すデータがポインターのコピーを使用して変更されない場合、Polyspace® はフラグを設定しません。

トラブルシューティング

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

すべて展開する

#include <string.h>

typedef unsigned short uint16_t;

uint16_t ptr_ex(uint16_t *p) {      /* Non-compliant */
    return *p;
}

char last_char(char * const s){     /* Non-compliant */
    return s[strlen(s) - 1u];
}

uint16_t first(uint16_t a[5]){      /* Non-compliant */
    return a[0];
}

この例では、準拠しない 3 つの異なるポインター パラメーターを示しています。

  • 関数 ptr_ex では、p はオブジェクトを変更しません。しかし、p が指す型は const 修飾子付きではないので、準拠していません。

  • last_char では、ポインター sconst 修飾子付きですが、指している型では修飾子付きではありません。s はオブジェクトを変更しないので、このパラメーターは準拠していません。

  • 関数 first は配列 a の要素を変更しません。しかし、要素の型は const 修飾子付きではないので a もまた準拠していません。

修正 — const キーワードの使用

1 つの修正方法として、const 修飾子を定義に追加します。

#include <string.h>

typedef unsigned short uint16_t;

uint16_t ptr_ex(const uint16_t *p){     /* Compliant */
    return *p;
}

char last_char(const char * const s){   /* Compliant */
    return s[strlen( s ) - 1u];
}

uint16_t first(const uint16_t a[5]) {   /* Compliant */
    return a[0];
}

チェック情報

グループ: 宣言と定義
カテゴリ: 推奨
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.