![プログラミング プログラミング](https://srad.jp/static/topics/programming_64.png)
C言語の開発者によるgoto文の使い方を対象とした実証研究の結果、「goto文は無害だと考えられる」 106
ストーリー by headless
無害 部門より
無害 部門より
Edsger Dijkstra氏がgoto文の危険性を主張したのは1968年。それから50年近く経過した現在もgoto文は使われ続けているが、Dijkstra氏が懸念したようなgoto文の無制限な使用が行われているのかどうかという点や、それがバグの原因となるような有害なものなのかどうかといった点については、よくわかっていなかったという。こういった点に関する実証研究が本家/.で紹介されている。
本家/.﹁Empirical Study On How C Devs Use Goto In Practice Says "Not Harmful"﹂より
200万近いC言語のファイルと1万1千件を超えるプロジェクトからランダムに抽出した統計的に有効なサンプルを質的および量的に分析したところ、開発者はほとんどの場合gotoの使用を適切に制限しており、Dijkstra氏が懸念したような無制限な使用は行われていないことが判明した。これらのことから、実際にはgotoは有害でないものと考えられる。
原因と結果が逆 (スコア:5, すばらしい洞察)
1968年の論文を踏まえて無軌道にgotoを使わなくてもいいように言語仕様が設計されたりプログラマーが使用を自重するようになったんだろ。
Re:原因と結果が逆 (スコア:2, すばらしい洞察)
今となっては goto 文を使う人は、そうした方が見通しいい場合に限り使っているという印象
case break の方が危ういね
#一般のブロック抜けgotoが欲しい
Re:原因と結果が逆 (スコア:3, 興味深い)
Re:原因と結果が逆 (スコア:3)
Re:原因と結果が逆 (スコア:2)
いや、ごめんなさい、 break じゃなくて continue にしないと同じ挙動にならなかった……。ますます annoymouse coward さんが何を言いたいのかわからない。
Re:原因と結果が逆 (スコア:2)
Re:原因と結果が逆 (スコア:2)
スラッシュドットには <ecode> という謎要素があって、それを使うと不等号とかもよしなに扱ってくれるので、 C++ とかのコードをコメントとして書く場合にはお勧め。
Re:原因と結果が逆 (スコア:2)
Re:原因と結果が逆 (スコア:1)
svn-init() {
svnadmin create .svnrepo
svn checkout file://$PWD/.svnrepo .
}
Re: (スコア:0)
「gotoはダメだgotoはダメだgotoはだめだ」って唱えながら、
こんなことするくらいなら、gotoのほうが遥かにまとも
do {
...
break;
...
} while(0);
Re: (スコア:0)
ごめんなさい
do {} while(false);多用してます…
だってラベル名考えるのがめんど(
流石にこれやるとき多重ループは禁止にしてますが。
あとgoto使うと途中宣言が禁止されるのが苦手
Re: (スコア:0)
久しくコーディングしていないけど、do { } while(0); はマクロ書くときくらいかも
あつものに懲りて膾を吹く (スコア:0)
直感的にそうだろうとは思っていたけど、こうしてきちっと調べて、言葉にしてもらえるといいね
Re: (スコア:0)
さんざgotoを悪者扱いしてきた奴の
言い訳っぽい
Re: (スコア:0)
言語はCなんだから言語使用は無関係と言えるのでは?
#ストーリーを読まなくてもすばらしい洞察。すばらしいですね。
Re:原因と結果が逆 (スコア:2)
E. ダイクストラのGo To Statement Considered Harmfulは1968年、C言語の誕生は1972年、仕様化はさらにその後ですから、「無関係と言える」と言えるかどうかは分かりません。
goto fail; (スコア:1, 参考になる)
iOS7.0.6で修正された「最悪のセキュリティバグ」はありがちなコーディングミスで発生していた
http://apple.srad.jp/story/14/02/24/094232/ [srad.jp]
Re:goto fail; (スコア:3, すばらしい洞察)
これをコーディングした開発チームがgoto文のせいだと結論づけるなら、
そのチームは今後も致命的なコーディングミスを量産し続けるでしょう。
goto文を使わなくなったとしても、ありがちなコーディングミスを
見つけられない検証プロセスしか持たない開発チームの生産物を受け取りたくない。
Re:goto fail; (スコア:1)
goto問題じゃなくてifの使い方だろ
Re:goto fail; (スコア:2, すばらしい洞察)
いや static変数の使い方 と 値を入れてないままの変数を返しているってのをチェックできていないというのが本質だろう。
static変数の定義が明示的な初期化が無くても0が保証されるという仕様は、バグの元だとおもう。この仕様がため、代入前の参照が警告にもならなかったのだろうし。
初期化子のない変数は-1などトラップされやすい値を入れるとか、デバッグ用コンパイルスイッチがあってもよさそう.
Re:goto fail; (スコア:1)
Re: (スコア:0)
いや、人間の注意力を過信してるのがいけないだけ。
if書いた後必ずブロックを開く({を書く)ようにすればバグは出ない。
正しいコーディングスタイルが広まった今、罪なのは設計であってgoto文せいではない (スコア:1)
Re: (スコア:0)
Re:正しいコーディングスタイルが広まった今、罪なのは設計であってgoto文せいではない (スコア:1)
そもそも、なんでもかんでも無制限にCを使わない (スコア:0)
バイナリを生成できる言語が他にないからCを使ってるだけで、
本音の所では、正直できればC以外で書きたいプロジェクトが結構あるような気がする
Re: (スコア:0)
べつに下手くそなc使いより上手なJAVA使いの方がいいコード書くやろ
Re: (スコア:0)
下手糞なC使いとの比較は、下手糞なJava使いじゃないのか?
目くそ鼻くそのような気がしてならない。
下手糞なC使いは下手糞なコーディングで、テスト中にプログラムをクラッシュさせる代わり、本番はそれなりに動くが、
下手糞なJava使いは下手糞なコーディングで、テストはそれなりにこなし、本番中にメモリリークや性能トラブルを起こすような印象がある。
例えだが、こんな感じの印象で比較して何の意味があるかと。
Re:そもそも、なんでもかんでも無制限にCを使わない (スコア:2)
Re:そもそも、なんでもかんでも無制限にCを使わない (スコア:2)
+じゃなくて
+=の話し。
+はコンパイラがstringbuilderにしてくれる
机上の空論 (スコア:0)
コードの質なんてコーダー次第なんだし、 いくら無作為に大量のサンプルを解析なんてしたところで、 使い方次第な物を杓子定規で定義しても意味なんて無いよ。
#バグの温床である事には変わりないわけだし
Re:机上の空論 (スコア:2, おもしろおかしい)
if文はバグの温床だから使用禁止ね。
Re:ヘーゲル・マルクス的止揚 (スコア:1)
すずめの例は、「だから米作をやめろ」まで言わないと
ただの真な文というだけだと思う。
Re:ヘーゲル・マルクス的止揚 (スコア:1)
Re:机上の空論 (スコア:1)
Re: (スコア:0)
こういう思考停止がgotoを無条件に禁止とか言い出して、余計なバグを生み出すんだなあ。
Re: (スコア:0)
68年ごろのソースを分析しろよ (スコア:0)
当時はひどかった
Re: (スコア:0)
あと他の言語でも調べてみて欲しいですね。BASIC,DOSみたいなMS系を
Re:68年ごろのソースを分析しろよ (スコア:1)
Re: (スコア:0)
DOSって何だ? .BAT の文法こと?
それはともかく、例えばFORTRAN IV (でも水準7000でもいいから)あたりで分析しないと意味無いよね。
Re: (スコア:0)
68年には当然彼の国民機もまだ存在していなかったし、8080さえできてないんじゃないのか。
Re:68年ごろのソースを分析しろよ (スコア:2)
---- 6809
萌え擬人化 (スコア:0)
後藤文ちゃんと、はじめてのCしても問題ないよねっ
悪いのはgoto文ではないんです (スコア:1)
『綺麗なコーディング規約とジョルト・コーラで育てたコードのgoto文は不具合を吐かないことがわかったんです』
『あんなに大きかったビジネスロジックのコードがこんなに小さくなるとは想像したこともなかった』
シリコンの谷のなんとか、ですね。
ちょっと意味がわかりません (スコア:0)
天然痘での死者が出ていないからCDCに保管されてる天然痘ウィルスは無害だった、って主張だよね。
Re:ちょっと意味がわかりません (スコア:1)
包丁の使い方を調査したところ、99%は適切に使用されている。
ということでしょ。
Re: (スコア:0)
全然違います
Cは (スコア:0)
コードに行番号がなくて、いちいちラベルとかつけなきゃいけないから
GOTOが使いにくい。
もっとBASICを見習ってほしい(Visual BASICはダメだよ)。
Re:GOTOを待ちながら (スコア:1)
ラッキーちゃんなんですね。