4.1.2 未定義の動作

この項では、ANSI規格における未定義の動作項目について説明します。

(1)

文字集合

ソースファイル中に文字集合に定められた文字以外がある場合、メッセージを出力します。

(2)

字句要素

文字“ ' ”、または文字“ " ”がその最後の分類(区切り子、および字句的に他の前処理字句の種類に一致しない単一の非空白類文字)に入る場合、メッセージを出力します。

(3)

識別子

識別子全文字を意味がある文字とするため、意味のない文字は存在しません。

(4)

識別子の結合

翻訳単位の中で同じ識別子が内部結合と外部結合の両方で現れた場合、メッセージを出力します。

(5)

適合型と合成型

同じオブジェクト、または関数を参照するすべての宣言は、適合しなければなりません。それ以外の場合、メッセージを出力します。

(6)

文字定数

特定の非図形文字は、\に続く英小文字から構成する拡張表記\a、\b、\f、\n、\r、\t、および\vによって表現できます。その他の拡張表記はもたず、\に続く文字は、その文字自身とします。

(7)

文字列リテラル−結合

単純文字列リテラルとワイド文字列リテラル字句が隣り合うとき、単純に文字列結合を行います。

(8)

文字列リテラル−変更

文字列リテラルの変更はユーザ責任となります。RAMに配置した場合は変更されますが、ROMに配置された場合は変更されません。

(9)

ヘッダ名

文字、'、"、//、または/*が、区切り記号<と>の間の文字列中、または二つの区切り記号”の文字列中に現れた場合は、そのままファイル名として扱います。\文字はフォルダ区切りとして扱います。

(10)

浮動小数点型と汎整数型

浮動小数点型の値を汎整数型に型変換する場合、整数部の値が汎整数型で表現できなければ、汎整数型で表現できる値に切りつめを行います。

(11)

左辺値及び関数指示子

不完全型が左辺値となった場合は、メッセージを出力します。

(12)

関数呼び出し−引数の個数

実引数の数が少ない場合、仮引数は不定値となります。実引数が多い場合、余剰な実引数はないものとして関数が実行され、実引数は意味を持ちません。

関数呼び出しに先立ち、関数宣言がある場合は、メッセージを出力します。

(13)

関数呼び出し−拡張後の引数の型

関数原型を含まない形で関数を定義し、かつ拡張後の実引数の型が、拡張後の仮引数の型と一致しない場合、仮引数は不定値となります。

(14)

関数呼び出し−適合しない型

呼び出される関数を表す式によって指される型と適合しない型で関数が定義されている場合、関数の戻り値は不正な値となります。

(15)

関数宣言−適合しない型

関数原型を含む型で関数を定義し、かつ拡張後の実引数の型が仮引数の型と適合しない場合、または関数原型が省略記号で終わっている場合、仮引数の型として解釈されます。

(16)

アドレス、および間接演算子

正しくない値がポインタに代入されている場合の、単項*演算子の動作は、ハードウエア設計、および正しくない値の内容により、不定な値を取るか、不正なアクセスとなります。

(17)

キャスト演算子−関数ポインタのキャスト

型変換されたポインタが元の型以外の関数を呼び出すために使われた場合、関数を呼び出すことは可能です。引数、戻り値が不適合な場合は、不正となります。

(18)

キャスト演算子−汎整数型のキャスト

ポインタを汎整数型にキャストした場合で、領域の大きさが不十分な場合は、キャストした型の領域の大きさに切り詰められます。

(19)

乗除演算子

コンパイル中に0による除算剰余算を検出した場合、メッセージを出力します。

実行時は、0除算例外が発生します。エラー処理ルーチンを記述した場合は、それに従います。

(20)

加減演算子−配列以外のポインタ

配列オブジェクトの要素を指すかのように動作するもの以外のポインタに対して、加算、または減算を行っている場合、あたかも配列の要素を指しているように振舞います。

(21)

加減演算子−別な配列へのポインタ減算

同じ配列オブジェクトの中を指すかのように動作するもの以外の二つのポインタに対し、減算を行なっている場合、あたかも配列の要素を指しているように振舞います。

(22)

ビット単位のシフト演算子

右オペランドの値が負であるか、または拡張した左オペランドのビット幅以上の場合、左オペランドのビット幅で右オペランドをマスクした値でシフトした値となります。

(23)

関係演算子−ポインタ

比較対象のポインタで指されているオブジェクトが同一の集成体オブジェクト、または共用体オブジェクトのメンバでない場合、あたかも同一のオブジェクトを指しているポインタ同士の関係演算として動作します。

(24)

単純代入

オブジェクトに格納されている値が、何らかの形でそのオブジェクトの記憶域に重なる他のオブジェクトを通してアクセスされる場合、重なりは完全に一致していなければなりません。さらに、二つのオブジェクトの型は、適合する型の修飾版、または非修飾版でなければなりません。一致しない重なりの代入は、代入によって代入元の値が破壊されます。

(25)

構造体指定子及び共用体指定子

メンバ宣言並びが名前付のメンバを含まない場合、C言語としてコンパイルすると、意味を持たない旨の警告メッセージを出力します。C++言語としてコンパイルすると、C言語と同一メッセージでエラーとします。

(26)

型修飾子−const

メンバ宣言並びが名前付のメンバを含まない場合、意味を持たない旨の警告メッセージを出力します。

(27)

型修飾子−volatile

volatile修飾型で定義されたオブジェクトを、非volatile修飾型の左辺値を使って変更しようとした場合、メッセージを出力します。

(28)

return

式を持たないreturn文を実行し、呼び出し元で関数呼び出しの値を使用している場合で、宣言がある場合はメッセージを出力します。宣言がない場合は、関数の戻り値が不定値となります。

(29)

関数定義

可変個引数の実引数を受け付ける関数が、省略記号表記で終わる仮引数型並びをもたずに定義された場合、仮引数の値が不定となります。

(30)

条件付取り込み

置き換え処理によって字句definedが生成される場合、またはdefined単項演算子のマクロ置き換え前の使用法が制約の中で規定した二つの形式のどちらにも一致しない場合、通常のdefinedとして扱います。

(31)

マクロ置き換え−前処理句を含まない実引数

実引数が(実引数の置換前に)前処理句を含まない場合、メッセージを出力します。

(32)

マクロ置き換え−前処理指令を持つ実引数

実引数の並びの中に、ほかの場合であれば前処理指令として働く前処理字句列がある場合、メッセージを出力します。

(33)

#演算子

置き換えの結果が、正しい単純文字列リテラルでない場合、メッセージを出力します。

(34)

##演算子

置き換えの結果が、正しい単純文字列リテラルでない場合、メッセージを出力します。