タグ

ブックマーク / blog-ja.intransient.info (3)

  • Success is a Journey, not a Destination: 全てのCプログラマが未定義な振る舞いについて知っておくべきこと #3/3

    [原文: What Every C Programmer Should Know About Undefined Behavior #3/3] このシリーズのPart 1では、Cにおける未定義な振る舞いと、未定義な振る舞いによって"安全な"言語よりもCのパフォーマンスがよくなることがある事例を示した。Part 2では、未定義な振る舞いが引き起こす驚くようなバグと、多くのプログラマがCに対して持っている誤解を見てきた。この記事では、これらに対して警告を出すためにコンパイラが直面する困難と、いくつかの驚かされる問題を取り除きつつパフォーマンスの優位を保つために、LLVMとClangが提供する特長とツールについて説明したい。 未定義な振る舞いを使って最適化するときにどうして警告してくれないの? 「コンパイラが未定義な振る舞いを使って最適化するときに、どうしてコンパイラは警告を出さないのか? ユー

  • Success is a Journey, not a Destination: 全てのCプログラマが未定義な振る舞いについて知っておくべきこと #2/3

    [原文: What Every C Programmer Should Know About Undefined Behavior #2/3] 連載のpart 1では、未定義な振る舞いとは何か、未定義な振る舞いを利用して、「安全な」言語よりもハイパフォーマンスなアプリケーションを生成するためにCとC++コンパイラが未定義な振る舞いをどのように利用しているのかを議論した。この記事では、未定義な振る舞いが引き起こす全く驚くような結果を説明し、Cがどんなに"安全でない"かを話したい。part 3では、この驚くような結果をやわらげるために、親切なコンパイラは何が出来るのか (それが必須の機能でないとしても) について話したいと思う。 今回の記事は「Cプログラマにとって、未定義な振る舞いが怖くて恐ろしいことがあるのはなぜなのか」と呼びたい。:-) コンパイラの最適化は驚くような結果を引き起こす 近年

  • 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