タグ

未定義に関するakaneharaのブックマーク (6)

  • 未定義の動作

    未定義の動作にはどのようなものがあるのでしょうか。C言語の標準規格であるJIS X 3010:2003(ISO/IEC 9899:1999)の「附属書J 可搬性」を参考に未定義の動作を列挙してみましょう。 規格の制約以外の箇所で現れる「…(し)なければならない」または「…(し)てはならない」という要求をプログラムが守っていない場合。(前提事項4) 空でないソースファイルが、改行文字で終了していない場合。改行文字で終了している場合で、その直前に逆斜線文字がある場合。ソースファイルが、前処理字句の途中または注釈の途中で終了している場合。(5.1.1.2) ##演算子による字句連結の結果として生成される文字の並びが国際文字名の構文規則に一致する場合。(5.1.1.2) ホスト環境のプログラムがmainという名前の関数を5.1.2.2.1で定められる4種類の方法のいずれかで定義しない場合。(5.1

  • 初級C言語Q&A(7)

    初出: C MAGAZINE 1995年12月号 Updated: 1996-03-12 [←1つ前] [→1つ後] [↑質問一覧] [↑記事一覧] [ホームページ] 不定と未定義 C言語で書いたプログラムのバグの中には、言語仕様上の動作が処理系に依存 するようなコードが原因のものがあります。コンパイラをバージョンアップした のでコンパイルし直してみたら動かなくなった、というのはよくある話です。コ ンパイラ自体のバグだったという悲劇的なケースもないわけではありませんが、 コンパイラのバージョンに依存するようなコードを書いていたため、ということ も案外多いようです。基的には、結果が不確実なコードは書かない、というの が原則ですが、そのためには、不定、未定義という考え方を身に付けておく必要 があります。 不定、未定義の定義 Q 【不定】 不定とは何か。 A C言語の仕様としては正しい書き方で

  • 「Cは超高級アセンブラ?」の「未定義動作」に対する逃げ道の探索 - Qiita

    概要 Cは超高級アセンブラ? - Qiita [キータ] yohhoyさんのコメント ここで挙げられているプログラムは、いわゆる「未定義動作」となります。 http://www.jpcert.or.jp/sc-rules/c-exp05-c.html 環境(コンパイラやOS等)によっては出力結果が20になったり18になったり、はたまた実行時クラッシュを引き起こしたりしますが、いずれもこのプログラムとしては「あり得る」実行結果です。 とあったので、逃げ道がないか探しました。 結論は、構造体の実体そのものにはconstをつけず、メンバにconstつければ逃げられるようです EXP05-C. const 修飾をキャストではずさない には、以下のように記述されています。 変数の型にたいするconst修飾をキャストしてはずさないこと。const 修飾をキャストしてはずすと、プログラムが定数値を変更で

    「Cは超高級アセンブラ?」の「未定義動作」に対する逃げ道の探索 - Qiita
  • Cは超高級アセンブラ? - Qiita

    Help us understand the problem. What is going on with this article?

    Cは超高級アセンブラ? - Qiita
  • EXP05-C. const 修飾をキャストではずさない

    EXP05-C. const 修飾をキャストではずさない ポインタ型のオブジェクトに対するconst修飾をキャストしてはずさないこと。const 修飾をキャストして外すと、ポインタによって参照されるオブジェクトをプログラムで変更できるようになり、未定義の動作となる可能性がある。C 標準の附属書 J 「未定義の動作」の 64 を参照すること。 C 標準 [ISO/IEC 9899:2011] の脚注には以下のように記載されている (セクション 6.7.3, para. 4): 処理系は、volatileでないconstオブジェクトを、読み取り専用記憶域に置いてもよい。さらに、処理系はそのアドレスが使われないならば、そのようなオブジェクトに記憶域を割り付けなくてもよい。 違反コード 以下のコード例の remove_spaces() 関数は、引数として文字列へのポインタ str および文字列長

    EXP05-C. const 修飾をキャストではずさない
  • Success is a Journey, not a Destination: 全てのCプログラマが未定義な振る舞いについて知っておくべきこと #1/3

    [What Every C Programmer Should Know About Undefined Behavior #1/3 の翻訳です。] LLVMでコンパイルしたコードは、最適化を有効にしているとたまにSIGTRAPシグナルを生成するのはなぜなのか、と聞かれることがある。いろいろ調べたあと、(X86での話だが) Clangは "ud2" インストラクションを生成していたことがわかった。"ud2" は__builtin_trap()が生成するインストラクションと同じものだ。[訳注: #UD例外を発生させる命令。ソフトウェアが#UD例外をハンドルできているかテストするために使われる。つまり、ソースコードが未定義な振る舞いを使っていたから、LLVMはud2インストラクションを生成したのであって、LLVMのバグではない、ということ] こういう問題は幾つかあって、すべて、Cの未定義な振る

  • 1