CおよびC における例とは? わかりやすく解説

Weblio 辞書 > 辞書・百科事典 > ウィキペディア小見出し辞書 > CおよびC における例の意味・解説 

CおよびC++における例

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/06/11 09:05 UTC 版)

未定義動作」の記事における「CおよびC++における例」の解説

パスカル・クオックとジョン・レガーによればC言語における未定義動作は、大きく次のような種類分類できるspatial memory safety violations (空間メモリ安全性違反temporal memory safety violations (時間メモリ安全性違反integer overflow整数オーバーフローstrict aliasing violations (厳密なエイリアシング違反alignment violations (アライメント違反) unsequenced modifications (非逐次的変更data races (データ競合) loops that neither perform I/O nor terminate入出力終了行わないループC言語では、初期化される前に自動変数使用すると、ゼロ除算符号付き整数オーバーフロー配列境界違反バッファオーバーフロー参照)、またはヌルポインタのデリファレンスと同様の未定義動作発生する一般に未定義動作は、抽象化された実行マシン不明な状態にするため、プログラム全体動作未定義にしてしまう。 文字列リテラル変更しようとすると、未定義動作発生するchar *p = "wikipedia"; // C言語では許可C++98/C++03では非推奨C++11から不正p[0] = 'W'; // 未定義動作 整数ゼロ除算すると、未定義動作発生するint x = 1;return x / 0; // 未定義動作 特定の種類ポインタ操作は、未定義動作引き起こす可能性がある。 int arr[4] = {0, 1, 2, 3};int *p = arr + 5; // 未定義動作配列読み込み)p = 0;int a = *p; // 未定義動作ヌルポインタのデリファレンス) CおよびC++では、オブジェクトへのポインター比較大小比較)は、ポインターが同じオブジェクトメンバーである、もしくは同じ配列要素指している場合にのみ厳密に定義されるint main(void){ int a = 0; int b = 0; return &a < &b; /* 未定義動作 */} return文到達することなく値を返すmain()以外の関数終わり到達すると、関数呼び出しの値が呼び出し元によって使用される場合未定義動作発生するint f(){} /* 未定義動作関数返り値呼び出し元で使用され場合) */ 2つのシーケンスポイント(英語: sequence point)の間でオブジェクト複数変更すると、未定義動作発生するC++11時点で、シーケンスポイントに関連して未定義動作引き起こす要因にはかなりの変更が行われたが、次の例では、CとC++両方未定義動作発生するi = i++ + 1; // 未定義動作 2つのシーケンスポイントの間でオブジェクト変更する場合格納する値を決定する以外の目的オブジェクトの値を読み取ることも、未定義動作となる。 a[i] = i++; // 未定義動作printf("%d %d\n", ++n, power(2, n)); // 同様に未定義動作 CとC++では、値のサイズ上のビット数、あるいは負の数だけビットシフトすると、未定義動作発生する。 ここで、コンパイラに関係なく最も安全な方法は、シフトするビット数(<<および>>ビット演算子の右オペランド)を常に0からsizeof(value)*CHAR_BIT - 1 までの範囲内にしておくことである。(ここで、valueビット演算子の左オペランドである) int num = -1;unsigned int val = 1 << num; // 未定義動作負数によるビットシフト)num = 32; // もしくは31より大きな任意の整数val = 1 << num; // リテラル「1」は32ビット整数型であるため、31ビット上のビットシフト未定義動作となるnum = 64; // もしくは63より大きな任意の整数unsigned long long val2 = 1ULL << num; // リテラル「1ULL」は64ビット整数型であるため、63ビット上のビットシフト未定義動作となる

※この「CおよびC++における例」の解説は、「未定義動作」の解説の一部です。
「CおよびC++における例」を含む「未定義動作」の記事については、「未定義動作」の概要を参照ください。

ウィキペディア小見出し辞書の「CおよびC における例」の項目はプログラムで機械的に意味や本文を生成しているため、不適切な項目が含まれていることもあります。ご了承くださいませ。 お問い合わせ



英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「CおよびC における例」の関連用語

1
未定義動作 百科事典
4% |||||

CおよびC における例のお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



CおよびC における例のページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
ウィキペディアウィキペディア
Text is available under GNU Free Documentation License (GFDL).
Weblio辞書に掲載されている「ウィキペディア小見出し辞書」の記事は、Wikipediaの未定義動作 (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。

©2025 GRAS Group, Inc.RSS