パスワードを忘れた? アカウント作成
210612 story
プログラミング

LLVMのC/C++コンパイラは分かりやすいエラーメッセージを出力 107

ストーリー by hayakawa
プログラマフレンドリーなエラーメッセージは大歓迎 部門より

あるAnonymous Coward 曰く、

やや旧聞となるかもしれないが、マイコミジャーナルにてLLVMのC/C++フロントエンドのエラーメッセージは分かりやすいという話が紹介されている。元ネタはLLVM Project Blogの「Amazing feats of Clang Error Recovery(LLVMのC/C++フロントエンド「Clang」のおそるべきエラーリカバリ機能)。

LLVMは現在開発が進められているコンパイラ環境で、ソースコードを一旦アーキテクチャ非依存の中間コードに変換、最適化を行った後ネイティブなコードを出力することで、より最適化されたバイナリを生成できるのが特徴。それだけでなく、C/C++フロントエンドである「Clang」は、「GCCと比べコンパイル時に分かりやすいエラーコードを出力する」というのも利点だそうだ。

例えば、Clangでは定義されていない型を使った場合、エラーメッセージ中で「unknown type name 'hogehoge'」といった形で示したり、正しい型の候補を示してくれる機能があるそうだ。C++でテンプレートを使用している場合、エラーメッセージが複雑で一見して理解できないものになる傾向があるが、Clangではこのようなエラーに対しても分かりやすい表示を行うという。

また、typedefで定義した型情報をエラーメッセージとともに表示したり、Gitなどでコードをマージした際に付けられる「 HEAD」といったマークも認識し、これをうっかり削除せずにコンパイルしてしまった場合には「error: version control conflict marker in file」などと適切なメッセージを表示するそうだ。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • 20年くらい前に遊びで386ネイティブのASMを吐くBASICコンパイラを作ったけどエラー処理がめんどくさかったです。

    問題が分かったときには問題の場所より先に進んでしまっていたりして、その場の状態をエラー通知にするのでは問題の箇所と全然違う話になるんですよね。

    でも、定数畳み込み最適化や、計算強度低減最適化とか入れたりして面白かったよ。

  • 直せよ (スコア:2, おもしろおかしい)

    by Anonymous Coward on 2010年04月13日 16時59分 (#1748184)

    そこまで丁寧に教えてくれるのなら、いっそ修正してくれればいいのに…。

    • Re:直せよ (スコア:4, おもしろおかしい)

      by Anonymous Coward on 2010年04月13日 17時22分 (#1748203)

      例えばさ
      「お前の書いたクソコード全部ゴミ箱入れたから。俺が生成したもの使っとけ。」
      とかコンパイラに言われたら、もう立ち直れないでしょ。

      親コメント
    • 直されたら困る (スコア:3, すばらしい洞察)

      by gonzo (38147) on 2010年04月13日 17時14分 (#1748197)

      勝手に直されたら、間違いに気づかないからより質の高いプログラムを組む姿勢が失われる可能性がある。
      さらに、勝手な修正で予期しない動きになってしまうと、単なるバグ以上の損失を生む恐れがある。
      勝手に直したら直したで文句言われるし・・・。

      だから、より正確に、かつわかりやすく間違いを指摘するのが正解。

      とはいえ、ダブルクオーテーションやセミコロンの抜けくらいはスルーして欲しいと思うこともある。
        # [ printf("Hello world\n) ] => 誰がどう見ても[ printf("Hello world\n"); ]だろう みたいな

      親コメント
      • by Anonymous Coward on 2010年04月13日 23時51分 (#1748458)

        JavaScriptには自動的にセミコロンの抜けを修正するメカニズムがありますが、
        これがかえってバグの原因になってしまうことがあります。

        return {
            status: true
        }

        と書いた場合は問題ありませんが、

        return
        {
            status: true
        }

        と書くと

        return;
        {
            status: true
        };

        と解釈されてしまい、undefinedが返されてしまいます。

        オライリーの「JavaScript: The Good Parts [oreilly.co.jp]」でも、「ひどいパーツ」の
        一つに挙げられています。

        親コメント
      • Re:直されたら困る (スコア:2, おもしろおかしい)

        by Anonymous Coward on 2010年04月13日 17時42分 (#1748219)

        printf("Hello world :)");
        かもしれません

        親コメント
      • by s02222 (20350) on 2010年04月13日 20時14分 (#1748314)
        >とはいえ、ダブルクオーテーションやセミコロンの抜けくらいはスルーして欲しいと思うこともある。

        後で直すからとりあえずワーニングで通してよ、とか。

        ワンライナーだとさらに。見づらいし、頑張って修正してると空しくなる。
        親コメント
    • Re:直せよ (スコア:3, 興味深い)

      by Anonymous Coward on 2010年04月13日 17時41分 (#1748218)
      直してくれるシステムもありましたけどね。Interlisp-Dとか。
      親コメント
    • Re:直せよ (スコア:2, すばらしい洞察)

      by leftwing (37789) on 2010年04月13日 17時14分 (#1748199) 日記

      どう直せと?

      親コメント
      • Re:直せよ (スコア:2, 参考になる)

        by ginga (20279) on 2010年04月13日 23時59分 (#1748465)
        そういえば TeX ってよく "Missing $ inserted" みたいに 「なんか足りないから俺様が入れておいてやったぜ」って言ってきますよね。

        実際には99%の場合,それじゃ済まなくて 結局止まって直さないといけないんだけど, 原因は最終的に諦めた場所じゃなくて, その手前辺りって罠はよく遭遇します…
        親コメント
      • Re:直せよ (スコア:1, おもしろおかしい)

        by Anonymous Coward on 2010年04月13日 20時43分 (#1748335)
        コンパイラ「直してやるから、何をしたいのか書けよ」
        とか云われたりしてw
        親コメント
    • Re:直せよ (スコア:1, 参考になる)

      by Anonymous Coward on 2010年04月13日 17時47分 (#1748230)
      コンパイラの話じゃなく実行時の事だけど…
      VBの日付関数関連で「与えられたパラメーターが日付としてあり得ない値だったら、パラメーターの順序を間違えたのだろうと勝手に解釈して正常に動くようにする」なんていう余計なお世話機能があったなぁ。

      完成後、しばらくは普通に動いていたけど、2001年1月2日にバグ発覚…なんてことがありました。

      直してくれるのはいいけど、「こう直そうかと思ってるけど、いいか?」という確認は欲しい。
      親コメント
      • by kei100 (5854) on 2010年04月13日 22時56分 (#1748414)

        それはVBじゃなくてOLEオートメーション共通じゃないですか?
        具体的には
        01/02/03はYYMMDD
        2001/02/03
        01/13/03はMMDDYY
        2003/01/13
        01/02/29はDDMMYY
        2029/01/02
        みたいな感じ。

        ちゃんと年月日を指定してシリアル値にしてないのが悪いかと。
        じゃないと、ロケール変更(地域と言語設定の日付の短い書式を標準から変更する)されたらバグりますよ?
        # 2000年問題もだが、30と入れて1930年になるか、2030年になるかも引き摺られるのでそろそろ要注意ですねぇ

        親コメント
  • 分かりやすい (スコア:1, おもしろおかしい)

    by Anonymous Coward on 2010年04月13日 19時05分 (#1748278)
    日本語エラーメッセージという触れ込みのコンパイラで呆れたことを思い出しました。

    例)
    英語:Syntax error
    日本語:シンタックスエラー

    # 発音をカタカナで書いただけかよ(-ω-#)
    • Re:分かりやすい (スコア:4, おもしろおかしい)

      by greentea (17971) on 2010年04月13日 20時02分 (#1748310) 日記

      $ chkconfig --list
      とコマンド入力したとき、各サービスがランレベルごとに

      acpi-support              0:off  1:off  2:on   3:on   4:on   5:on   6:off
      acpid                     0:off  1:off  2:off  3:off  4:off  5:off  6:off
      alsa-utils                0:off  1:off  2:off  3:off  4:off  5:off  6:off
      anacron                   0:off  1:off  2:off  3:off  4:off  5:off  6:off

      のように表示されるのですが、日本語化された版だと

      acpi-support              0:オフ  1:オフ  2:オン  3:オン  4:オン  5:オン  6:オフ
      acpid                     0:オフ  1:オフ  2:オフ  3:オフ  4:オフ  5:オフ  6:オフ
      alsa-utils                0:オフ  1:オフ  2:オフ  3:オフ  4:オフ  5:オフ  6:オフ
      anacron                   0:オフ  1:オフ  2:オフ  3:オフ  4:オフ  5:オフ  6:オフ

      余計に見にくいわ、ボケ、という話を聞いたことがあります。

      # 私が使っているのは大丈夫でしたが。

      --
      1を聞いて0を知れ!
      親コメント
      • by kiralin7566 (36977) on 2010年04月13日 22時13分 (#1748379) 日記

        日本語化された版だと

        あーあーあーあー。

        それ、どのディストリビューションだったかなあ…CentOSでお目にかかった気がします。
        今、自宅のSUSE見たら英語だった。

        でも、YaSTを日本語で見たいからロケールのデフォルトを日本語にしてると、時々変な
        タイミングで日本語に出くわしたりします。Sambaとか。

        lib/util_sock.c:1432(get_peer_addr_internal) getpeername failed. Error was 通信端点が接続されていません

        「通信端点」ってナニ?

        # ググると放っといていいエラーっぽいけど。何を訳したらこれなのかな…

        --
        はじける加齢の香り!orz
        親コメント
        • Re:分かりやすい (スコア:2, おもしろおかしい)

          by nox_dot (11614) on 2010年04月14日 0時03分 (#1748470) 日記

          オフトピですが、最近、うちで使っている電話会議システムが日本語化されて、
          「current meeting」が「会議電流」となっていて、笑いました。
          笑ってないで、翻訳に貢献すればいいのですが…。すみません。

          親コメント
          • オフトピですが、最近、うちで使っている電話会議システムが日本語化されて、
            「current meeting」が「会議電流」となっていて、笑いました。

            ひどい誤訳ですね。「電流会議」と訳すべきです。たぶんほかに電圧会議とか抵抗会議とかがあるのでしょう。

            親コメント
          • by kiralin7566 (36977) on 2010年04月14日 0時19分 (#1748483) 日記

            > 「current meeting」が「会議電流」となっていて、笑いました。
            > 笑ってないで、翻訳に貢献すればいいのですが…。すみません。

            いやいや大丈夫。
            多分私も出くわしたらひとしきり笑った後、「どうして『みなさんビリビリ〜』なことになったんだろ?」
            って思っちゃいます(笑)

            こう、絶対日本語話者が訳してないですよね(笑)
            機械翻訳に通したのかしら。

            # 「サウソトプラスター用」と書かれたMIDIケーブルを見たことがあるw

            --
            はじける加齢の香り!orz
            親コメント
    • >英語:Syntax error
      >日本語:シンタックスエラー

      「文法エラー」「構文エラー」ってのも、何か違う様な気もするね。
      翻訳集だとこれらが使われているけど、実際には、初歩的な誤字だろうといったケースが多いね。

      親コメント
    • by Anonymous Coward on 2010年04月13日 19時23分 (#1748288)
      ところがどっこいカタカナ語になっただけで理解できた (つもりになれる) 人も多いらしい。

      英語だというだけで読むことを放棄する人も多い世の中 (技術者がそれで良いのか?) 、カタカナ語になってるだけでも有難いのかもしれない…。
      親コメント
  • by Tuatha D Danaan (32722) on 2010年04月13日 20時24分 (#1748326)

    hellow.cpp(3) あっ
    とか
    hellow.cpp(3) え…?

    とかで十分です。

    --
    #いや、それより罵ってくれるコンパイラの方がいいのか…

    • by ei (19798) on 2010年04月13日 22時09分 (#1748377) 日記
      | #いや、それより罵ってくれるコンパイラの方がいいのか…

      むかーし昔のそのむかし、どこぞのBASIC処理系のエラーメッセージ「ERROR 123」とかが「バカヤロ 123」となるように改造(バイナリパッチ)してあるのを見たことを、思ゐ出してしまいました。
      親コメント
  • by kilin28 (10167) on 2010年04月13日 20時52分 (#1748341) 日記

    コンパイル前に確認しているよね、clangはまず文法チェックするの? (など、ノンPGがほざく

typodupeerror

コンピュータは旧約聖書の神に似ている、規則は多く、慈悲は無い -- Joseph Campbell

読み込み中...