メインコンテンツ

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

CERT C++: STR30-C

Do not attempt to modify string literals

説明

ルール定義

文字列リテラルを変更しないようにします。1

Polyspace 実装

ルール チェッカーは、"文字列リテラルを変更しています" をチェックします。

すべて展開する

問題

"文字列リテラルを変更しています" は、文字列リテラルを変更しようとすると発生します。たとえば、Polyspace® は次の場合に違反を報告します。

  • 文字列リテラルを代入先として使用する。

  • 文字列リテラルを、引数を変更する関数に渡す。このような関数の例には、strcpystrncpystrcatmemset があります。

Polyspace は、次のものを文字列リテラルとみなします。

  • 接頭辞なしの文字列

  • 接頭辞 u8LuU 付きの文字列。

  • 接頭辞 u8LuU 付きの生の文字列 (R"...")。

  • "" 演算子を使用して定義された、ユーザー定義の文字列リテラル。

リスク

文字列リテラルを変更しようとすると、未定義の動作が発生します。文字列リテラルは一般的に読み取り専用メモリに保存されるため、文字列リテラルを変更しようとすると、アクセス違反になる可能性があります

修正方法

文字列リテラルは変更しないようにします。たとえば、文字列リテラルを const 修飾子付きのポインターまたは const 修飾子付きのオブジェクトに割り当てます。

以下の修正例を参照してください。

問題を修正しない場合は、改めてレビューされないように結果またはコードにコメントを追加します。詳細は、以下を参照してください。

例 - 文字列リテラルへの書き込み
#include <string.h>

char* buffer = "abcdeXXXXXXX";

void func(char* string) {
    char *ptr = (char*)strchr(buffer,'X');
    if(ptr)
        strcpy(ptr,string); //Noncompliant
}

この例では、buffer は文字列リテラルであるため、strchr(buffer,'X') は文字列リテラルを返します。文字列リテラルが strcpy のコピー先引数として使用されている場合、Polyspace はこのルールの違反を報告します。

修正 — 文字列リテラルを配列内にコピーする

この違反を解決するには、文字列リテラルを配列 buffer の初期化子として使用します。こうすると、文字列リテラルのコピーが buffer に保存され、安全に変更できるようになります。

#include <string.h>

char buffer[] = "abcdeXXXXXXX";

void func(char* string) { 
    char *ptr = (char*)strchr(buffer,'X');
    if(ptr)
        strcpy(ptr,string);
}

チェック情報

グループ: 05.文字と文字列 (STR)

バージョン履歴

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.