メインコンテンツ

CERT C: Rec.DCL13-C

当該関数によって変更されない値へのポインターである関数パラメーターは const として宣言する

説明

ルール定義

当該関数によって変更されない値へのポインターである関数パラメーターは const として宣言します。1

Polyspace 実装

ルール チェッカーは、"cont 修飾子付きでない関数パラメーターへのポインター" をチェックします。

すべて展開する

問題

ルール チェッカーは、ポインターによってその指定先のオブジェクトが変更されない場合、const 関数パラメーター以外を指すポインターにフラグを設定します。ポインターはオブジェクトを変更することを意図していないので、const 修飾子付きの型を指し示さなければならないものと仮定します。

リスク

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

例 - const 修飾子付きの型を指し示す必要のあるポインター
#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];
}

チェック情報

グループ: Rec.02.宣言と初期化 (DCL)

バージョン履歴

R2019a で導入


1 This software has been created by MathWorks incorporating portions of: the “SEI CERT-C Website,” © 2017 Carnegie Mellon University, the SEI CERT-C++ Web site © 2017 Carnegie Mellon University, ”SEI CERT C Coding Standard – Rules for Developing safe, Reliable and Secure systems – 2016 Edition,” © 2016 Carnegie Mellon University, and “SEI CERT C++ Coding Standard – Rules for Developing safe, Reliable and Secure systems in C++ – 2016 Edition” © 2016 Carnegie Mellon University, with special permission from its Software Engineering Institute.

ANY MATERIAL OF CARNEGIE MELLON UNIVERSITY AND/OR ITS SOFTWARE ENGINEERING INSTITUTE CONTAINED HEREIN IS FURNISHED ON AN "AS-IS" BASIS. CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY KIND, EITHER EXPRESSED OR IMPLIED, AS TO ANY MATTER INCLUDING, BUT NOT LIMITED TO, WARRANTY OF FITNESS FOR PURPOSE OR MERCHANTABILITY, EXCLUSIVITY, OR RESULTS OBTAINED FROM USE OF THE MATERIAL. CARNEGIE MELLON UNIVERSITY DOES NOT MAKE ANY WARRANTY OF ANY KIND WITH RESPECT TO FREEDOM FROM PATENT, TRADEMARK, OR COPYRIGHT INFRINGEMENT.

This software and associated documentation has not been reviewed nor is it endorsed by Carnegie Mellon University or its Software Engineering Institute.