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

スラドに聞け:いま使っている言語の仕様、把握している? 212

ストーリー by hylom
仕様書は読んでみると楽しいですよ 部門より
m_nukazawa曰く、

もうかなり前の話になってしまうのだが、C言語における『未定義動作』の存在を知った時は衝撃を受けた[本の虫:Old New Thing: 未定義動作はタイムトラベルを引き起こす(他にもいろいろあるけど、タイムトラベルが一番ぶっ飛んでる)Success is a Journey, not a Destination:全てのCプログラマが未定義な振る舞いについて知っておくべきこと #1/3]。以降、gccのWstrict-aliasingオプションは必ず付けるようにしているし、ポインタの怪しい型キャストはしないようにしている。

それなりに親しんでいるつもりのテクノロジでも、重要なことを知らないまま使っていて、落とし穴にはまることがままある。必要と思ってはいても、つい仕事が忙しい、探して手に入れるのが面倒であるなどを理由にして、Webの断片的な情報や入門書で用を足し、言語仕様書などを読まないで済ませてしまっている読者の方はタレコミ主以外にもいるのではないかと思う。

さて、あなたは自分が使うテクノロジ・言語仕様のドキュメントを読むだろうか? また、それをどこで手に入れるだろう? VimやEclipseの取扱説明書は読む? ユニットテストフレームワークのドキュメントに満足している? MSDNのディスクはあなたの本棚の上でホコリをかぶっているのだろうか?

……などなど、あなたとあなたが使っているテクノロジとの交際方法について、広く自由に語っていただければ幸いである。

ちなみにタレコミ主としては、C言語以外にもあるだろう「未定義動作」的な話、実際に落とし穴にはまった際のエピソードなども、語っていただければと期待している。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by mhexanon (16193) on 2016年08月24日 15時29分 (#3069035) 日記

    モバイルギア(WindowsCE機)のアプリケーションを
    開発していたときに、C のソースで構造体を使ったら
    何をやってもハードウェア例外発生。
    MIPS ではデータ配置が 4バイトとの倍数というルールを知らなかった。
    けっきょくダミーバイトを埋め込んで解決したけど、未熟だったなあ。
    構造体の配置 [microsoft.com]

  • 規格上はUnspecified(未定義)で,実際に3.3Vを採用している製品もある.
  • by Anonymous Coward on 2016年08月24日 15時22分 (#3069032)

    日本語のLanguage Specification

    未定義や処理系依存が多すぎて苦労しとるのですが・・・

  • by Anonymous Coward on 2016年08月24日 15時50分 (#3069049)

    十数年仕事で(アマ時代を入れると20年以上)使っていたのに知らなかったので数日はまった。

    バグったコードからエラー原因を簡素化したテストコードは以下。
    float型(i)とint型(k)で1ずつ加算していって異なったら
    標準エラーに出力。 

    #include <stdio.h>
    int main(){
      float i;
      int k;
      i=0;
      for(k=0;k<=16777217;k++){
        if(k != (int)i) fprintf(stderr,"%i %i\n",k,(int)i);
        i += 1;
      }
      return 0;
    }

    • floatと整数と言えば。

      int*をfloat*にキャストして、それをデリファレンスすること(intをfloatとしてアクセスすること)は未定義である。

      を見て、もすぬごい衝撃がががが。

      Fast inverse square root [wikipedia.org]とか、Cで書きたくなくなる。

      親コメント
  • by Anonymous Coward on 2016年08月24日 16時26分 (#3069070)

    C言語ぽい文法なのに、たまに変なアレンジが入っているのが嫌、というか怖い。

    「switch 文の中で continue を書くと、break と同じ動作」ってのにハマり、
    調べてその事実にたどり着いたときは、衝撃でしばらく作業が手につかなかったw

  • by Anonymous Coward on 2016年08月24日 17時13分 (#3069101)

    「全部読んで頭に叩き込んでからプログラミングせんか!!」

    # この発言はフィクションです。別に先輩に言われたとかではありません。
    # プログラミングしてる時においおい読んでいけばいいんじゃないのと思うACであった

  • > MSDNのディスクはあなたの本棚の上でホコリをかぶっているのだろうか?

    かつてはディスク無しオプションでサブスクリプション契約すると1ヶ月分安くなってたような記憶があるけど、
    今はもうディスク配布してないよ。

  • int a[]={10, 11, 12};
    int *p = a;

    *p++ = p[1]; /* なんかトリッキー… */

    printf("%d %d %d", a[0], a[1], a[2]);

    これをコンパイルすると
    gcc4.7以前だと 11 11 12
    gcc4.8以降だと 12 11 12
    わんぱくですね。

  • by Anonymous Coward on 2016年08月25日 1時54分 (#3069372)

    '_'大文字で始まるものと'__'から始まる識別子は
    Cの予約語であるというのはかなりのベテランでも知らない人が多い
    _TEST とか __index__ のようなものを定義してしまい、
    標準ヘッダの定義が置き換えられてしまった結果。
    理解不能なコンパイルエラーが発生して原因の究明までに
    大変な時間がかかった事があった。

  • by Anonymous Coward on 2016年08月25日 10時51分 (#3069510)

    今使ってるいる日本語の仕様、把握している?

  • 旧聞なので白状しますが、ン十年使ってて裏も表も知り尽くしているつもりだったbash、shell parameter expansionを事を後から知って「すみません、完全に勉強不足でした」となった事ならありますよ。 https://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Exp... [gnu.org]
  • by tnk (13707) on 2016年08月25日 15時09分 (#3069697)

    Javaの世界では,この手の「あまり知られてないマイナーな言語仕様」「勘違いしている人が多い文法」などをもとにした,「このプログラムを実行するとどうなるでしょう?」というクイズがJava Puzzlerとして一般化しています。

    書籍 [amazon.co.jp]でも出ていますし,カンファレンスなどでも定番の出し物 [java-users.jp]になってます。

  • by Anonymous Coward on 2016年08月24日 15時16分 (#3069027)

    プログラミング言語の話とはちょっと違うが、浮動小数点演算でありがちな思い込みを一つ
    正確な表現では無いが、NaNというのはフラグが立つだけで、有効では無い値での演算が停止したり、値が途中でゼロクリアされるわけではない
    都合があって、組込システムで周期的にNaNのチェックをして、演算結果をリセットするコードを書いたことがある.....
    #どんな時でも馬鹿よけの仕組みは必要です

typodupeerror

あつくて寝られない時はhackしろ! 386BSD(98)はそうやってつくられましたよ? -- あるハッカー

読み込み中...