メインコンテンツ

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

CERT C: Rule STR30-C

Do not attempt to modify string literals

説明

ルール定義

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

Polyspace 実装

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

すべて展開する

問題

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

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

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

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

  • 接頭辞なしの文字列

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

リスク

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

修正方法

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

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

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

例 - 文字列リテラルへの書き込み
#include <string.h>
void foo()
{
	char *buffer = "literal";
	//....
	buffer[0] = 't'; //Noncompliant


}

この例では、文字列リテラル buffer が変更されると、Polyspace が違反を報告します。

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

この違反を修正するには、リテラルを配列内にコピーします。

#include <string.h>

void foo() {
    // Original string literal
    const char *literal = "literal"; 
    char buffer[8]; 
    // Copy the literal into the buffer
    strcpy(buffer, literal);
    // modify
    buffer[0] = 't';

}

チェック情報

グループ: Rule 07.文字と文字列 (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.