メインコンテンツ

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

MISRA C:2012 Rule 7.4

A string literal shall not be assigned to an object unless the object’s type is “pointer to const-qualified char”

説明

ルール定義

A string literal shall not be assigned to an object unless the object’s type is “pointer to const-qualified char” 1 .

根拠

このルールにより文字列リテラルの変更を許可するような代入を回避します。

文字列リテラルを変更しようとすると未定義の動作が発生する可能性があります。たとえば、実装の一部で文字列リテラルを読み取り専用メモリに保存できるとします。文字列リテラルを変更しようとすると、例外やクラッシュが発生する可能性があります。

例外として、可変引数リストによって文字列リテラルを可変個引数関数に渡す場合は、このルールに違反しません。

Polyspace 実装

ルール チェッカーは、以下への文字列リテラルの割り当てにフラグを設定します。

  • const char* 以外のデータ型のポインター。

  • const char 以外のデータ型の配列。

トラブルシューティング

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

すべて展開する

char *str1 = "xxxxxx";            // Non-Compliant 
const char *str2 = "xxxxxx";      // Compliant 

void checkSystem1(char*);
void checkSystem2(const char*);

void main() {
 checkSystem1("xxxxxx");    // Non-Compliant 
 checkSystem2("xxxxxx");    // Compliant 
}

この例では、文字列リテラルが const char* ポインターに直接または関数の引数のコピーを介して代入される場合、ルールに違反しません。const 修飾子を使用しない場合のみルールに違反します。

この例では、文字列リテラルが可変個引数関数 foo および bar に渡されます。文字列リテラルは変数引数リストの一部として foo に渡されるため、Polyspace® は違反を報告しません。bar については、文字列リテラル引数が char* にバインドするため、このルールに準拠していません。Polyspace は bar に対して違反を報告します。

extern void foo( int x, ... );

extern void bar( char *text, ... ); 

void variadic( void )
{
    foo( 42u, "String Literal" ); /* Compliant by exception*/
    bar( "String Literal", 42u ); /* Noncompliant*/
}

チェック情報

グループ: リテラルおよび定数
カテゴリ: 必要
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.