| SQLインジェクション対策はおすみですか? 開発開始時点からのコンサルティングから、公開済みWebサイトの脆弱性検査、 脆弱性発見後の適切な対策まで |
2007-09-15 [JavaScript]ラベルつきbreak文
●ループやswitch以外のブロックを脱出するbreak
JavaScriptでは、breakにラベルを指定できて、通常は多重ループを抜ける場合に用いられるような説明がなされていると思う。しかし、ラベル付のbreakは、ループやswitch以外の文を終わらせることもできる(Javaもそう)。
例えば以下のようなプログラム。
document.writeln("A");
L1: {
document.writeln("B");
L2: {
document.writeln("C");
break L1; // L1の文を終わらせるので、D、Eは実行されない
document.writeln("D");
}
document.writeln("E");
}
document.writeln("F");
【実行結果】
A
B
C
F
多重ループを一気に脱出する場合は、それなりに用途を思いつくが、ただの文ブロックを抜けるとなると、限りなくgotoを使っているような感覚を覚える。文ブロック以外に、try/catch/finallyやwith文、if/elseなどでも同様である。
あえて文ブロックをbreakで抜ける用途を強引に考えてみた。ループで配列をサーチするような場合に、対象が見つかった場合と見つからなかった場合で処理を分けたい。以下のように書いてみた。
function search(a, x) {
L1: {
for (var i = 0; i < a.length; i++) {
if (a[i] == x) {
// 見つかった場合の処理
alert('見つかった:a[' + i + '] == ' + x);
break L1;
}
}
// 見つからなかった場合の処理
alert('見つからなかった:' + x);
}
// 共通の後始末(あれば)
}
search([1, 2, 5, 6, 8], 5); // 見つかる場合の呼び出し例
search([1, 2, 5, 6, 8], 7); // 見つからない場合の呼び出し例
うわっ、これは駄目だ。こんなへたくそなプログラムは人様には見せられない・・・
まぁ、こういう場合は、returnを使うんでしょうね。ただ、上記の例にはないが、「共通の後始末」が必要な場合は、ちょっとだけ上記のような書き方をする動機づけになる。try/finallyを使えばすむ話ではあるが。
追記(2007/09/16 13:20)
「へたくそな」例は僕だったらこう書くでしょうね。
function searchIndex(a, x) {
for (var i = 0; i < a.length; i++)
if (a[i] == x)
return i;
return -1;
}
function search(a, x) {
var index = searchIndex(a, x);
if (index >= 0) {
// 見つかった場合の処理
alert('見つかった:a[' + index + '] == ' + x);
} else {
// 見つからなかった場合の処理
alert('見つからなかった:' + x);
}
// 共通の後始末(あれば)
}
search([1, 2, 5, 6, 8], 5); // 見つかる場合の呼び出し例
search([1, 2, 5, 6, 8], 7); // 見つからない場合の呼び出し例
あまり気の利いたプログラムではないと僕自身思いますが、こういう単純素朴な形なるように一生懸命考えるのが最近の好みです。そして、僕自身は多重ループからの脱出であっても、ラベルつきのbreakは使わないと思います。上記の例は、JavaScriptのトリビア的なネタということで。
自作コンパイラの部屋 > オブジェクト指向プログラム言語としてのJavaScript > ループやswitch以外のブロックを脱出するbreak
- http://www.tokumaru.org/JavaScript/ ×649
- http://www.tokumaru.org/ ×212
- http://www.tokumaru.org/JavaScript/index.htm ×33
- http://b.hatena.ne.jp/entry/5892458 ×16
- http://d.hatena.ne.jp/m383m/20070918/1190100985 ×13
- http://d.hatena.ne.jp/ockeghem/20070528 ×6
- http://erokey.ddo.jp/diary2/rec/b/20070901.html ×5
- http://a.hatena.ne.jp/yamagata21/ ×5
- http://erokey.ddo.jp/diary2/一般/一般常識問題/20070901.htm... ×5
- http://d.hatena.ne.jp/teracc/20070715 ×5
- http://www.tokumaru.org/index.htm ×5
- http://b.hatena.ne.jp/HiromitsuTakagi/?of=20 ×4
- http://b.hatena.ne.jp/ockeghem/ ×4
- http://d.hatena.ne.jp/teracc/20070908 ×4
- http://bloger.x0.com/result/buzz/buzz clip ×3
- http://b.hatena.ne.jp/t/javascript?sort=eid ×2
- http://tokumaru.org/ ×2
- http://blog.chew.jp/result/sql データベース名/sql データベース名... ×2
- http://b.hatena.ne.jp/entry/http://d.hatena.ne.jp/... ×2
- http://d.hatena.ne.jp/teracc/ ×2
- http://www.math.sansu.org/u/diary/?date=200706 ×2
- http://b.hatena.ne.jp/xnights/javascript/ ×2
- http://a.hatena.ne.jp/harupu/ ×2
- http://www.devnull.jp/tdiary/200709.html ×2
- http://a.hatena.ne.jp/ockeghem/ ×2
- http://bakera.jp/ebi/topic/2986 ×2
- http://a.hatena.ne.jp/mao140/ ×2
- http://www.tokumaru.org ×2
- http://b.hatena.ne.jp/HiromitsuTakagi/20070901 ×1
- http://b.hatena.ne.jp/entry/5303987 ×1
- http://d.hatena.ne.jp/teracc/searchdiary?of=10&wor... ×1
- http://clip.nifty.com/entry/a59bf3224009c0bff718ff... ×1
- http://search.www.infoseek.co.jp/Seek?col=OW&qt=ja... ×1
- http://b.hatena.ne.jp/keyword/db ×1
- http://search.www.infoseek.co.jp/Web?svp=SEEK&qt=j... ×1
- http://d.hatena.ne.jp/ikepyon/ ×1
- http://search.live.com/results.aspx?q=javascript b... ×1
- http://b.hatena.ne.jp/Kanatoko/favorite ×1
- http://search.live.com/results.aspx?q=javascript ル... ×1
- http://nihongo.homeip.net/word/ループ/ ×1
- http://64.233.179.104/translate_c?hl=pt-BR&ie=UTF-... ×1
- http://bakera.jp/ebi/2007/9/2 ×1
- http://b.hatena.ne.jp/entry/6660206 ×1
- http://www.tokumaru.org/was/ ×1
- http://b.hatena.ne.jp/mitsuki_engawa/security/ ×1
- http://b.hatena.ne.jp/Hamachiya2/?of=100 ×1
- http://209.85.175.104/search?q=cache:gkIjjbtVprMJ:... ×1
- http://www.jumperz.net/index.php?i=6&threadId=5258... ×1
- http://d.hatena.ne.jp/tessy/20070827 ×1
- http://del.icio.us/tessy/Application ×1
- http://d.hatena.ne.jp/monjudoh/20070807/1186505259... ×1
- http://209.85.175.104/search?q=cache:ZU-arVkA6LkJ:... ×1
- http://b.hatena.ne.jp/entry/http://www.tokumaru.or... ×1
- http://b.hatena.ne.jp/ockeghem/文法/?mode=detail ×1
- http://b.hatena.ne.jp/HiromitsuTakagi/?of=40 ×1
- http://209.85.175.104/search?q=cache:LLgt31PO5IsJ:... ×1
- http://b.hatena.ne.jp/mind/?word=; ×1
- http://d.hatena.ne.jp/ockeghem/ ×1
- http://209.85.175.104/search?q=cache:gkIjjbtVprMJ:... ×1
- http://d.hatena.ne.jp/ikepyon/searchdiary?word=*[セ... ×1
- http://search.live.com/results.aspx?q=ループ 脱出&form=... ×1
- http://d.hatena.ne.jp/ockeghem/about ×1
- http://b.hatena.ne.jp/miya2000/ ×1
- http://b.hatena.ne.jp/ockeghem/break/ ×1
- http://d.hatena.ne.jp/keyword/XSS脆弱性 ×1
- http://search.www.infoseek.co.jp/Web?qt=Java switc... ×1
- http://d.hatena.ne.jp/teracc/20070808 ×1
- http://209.85.173.104/search?q=cache:LLgt31PO5IsJ:... ×1
- http://b.hatena.ne.jp/hasegawayosuke/イメージファイト/?mod... ×1
- http://b.hatena.ne.jp/miya2000/javascript/golf/ ×1
- http://d.hatena.ne.jp/ockeghem/?of=5 ×1
- http://d.hatena.ne.jp/ockeghem/20070502/1178042280... ×1
- http://b.hatena.ne.jp/t?tag=javascript&of=25&sort=... ×1
- http://pookmark.jp/user/tsupo/XSS ×1
- http://b.hatena.ne.jp/HiromitsuTakagi/20070812 ×1
- http://d.hatena.ne.jp/m383m/ ×1
- http://search.live.com/results.aspx?q=breakラベル&src... ×1
- http://www.bloglines.com/search?q=buzz&ql=ja&s=f&p... ×1
- http://www.devnull.jp/tdiary/ ×1
- http://www.math.sansu.org/u/diary/?date=20070922 ×1
- javascript break ×215 / javascript ラベル ×24 / javascript switch ×24 / JavaScript break ×22 / javascript for break ×22 / キーワード不明 ×20 / switch break ×8 / break javascript ×7 / javascript break if ×7 / switch 脱出 ×6 / javascript break; ×5 / javascript if break ×5 / 徳丸浩 ×5 / ループ ラベル ×4 / javascript ループ break ×3 / ラベル付きbreak ×3 / javascript label ×3 / Switch 脱出 ×3 / 画像 サニタイズ ×3 / ラベル付き break ×3 / ラベル付 break文 ×3 / javascript for ループ ×3 / JavaScript ラベル ×3 / javascript ループ 例 ×2 / IEEE754 ×2 / XSS javascript テスト ×2 / javascript if ラベル ×2 / JAVAscript break ×2 / break if break javascript ×2 / twitter XSS ×2 / HTML "&" xss ×2 / C# ループ 脱出 ×2 / ラベル付きbreak文 ×2 / break ラベル ×2 / JAVASCRIPT case BREAK文 ×2 / ruby 多重ループ ×2 / XSS PNG ×2 / java script ラベル ×2 / PNG XSS ×2 / JavaScript 多重ループ ×2 / javascript ループ ラベル ×2 / HASHコンサルティング株式会社 ×2 / 脱出 switch ×2 / break文 ×2 / 変数 型のない SQLインジェクション ×2 / 脱出 SWITCH ×2 / javascript if 抜ける ×2 / JavaScript ループ ×2 / javascript break ラベル ×2 / ラベル付break文 ×2 / javascript switch break ×2 / php 文字 画像 ×2 / JavaScript 第5版 ×2 / DB 暗黙 型変換 パフォーマンス ×2 / javascript 多重ループ break ×1 / JavaScript alert 以外 ×1 / switch ループ ×1 / JAVASCRIPT ラベル 値 ×1 / javascritp function 脱出 ×1 / javascript for break; ×1 / switch break 使わない ×1 / switch javascript return ×1 / ラベル javascript ×1 / 多重ループ 抜ける Java ×1 / javascript for brake ×1 / java ラベル付きbreak文 ×1 / break if ラベル C ×1 / javascript ループ ×1 / 多重ループ 脱出 ×1 / JavaScript for break ×1 / COBOL GO TO 抜ける ×1 / JavaScript switch if 速度 ×1 / javaScript break ×1 / javascript switch alert ×1 / ruby break ラベル ×1 / for break javascript ×1 / for if break javascript ×1 / switch javascript ×1 / javascript forループを抜ける break ×1 / javascript switch 配列 ×1 / 脱出 ブロック ×1 / sql ループ function ×1 / C break 多重ループ ×1 / 以外 ループ ×1 / c switch 以外 ×1 / if sql 抜ける ×1 / c break 多重ループ ×1 / 多重ループ break ×1 / JavaScript BREAK ×1 / ブロック break ×1 / Java ループを抜ける ラベル ×1 / バインドメカニズム サニタイズ ×1 / javascript for brak ×1 / javascript for 脱出 break ×1 / Javascript break c ×1 / JAVAscript break(1); ×1 / ruby 多重ループ 脱出 ×1 / プログラム ループ 抜ける ×1 / sql LOOP 抜ける ラベル ×1 / javascript switch break return ×1
| SQLインジェクション対策はおすみですか? 開発開始時点からのコンサルティングから、公開済みWebサイトの脆弱性検査、 脆弱性発見後の適切な対策まで |
「深い階層の途中まで抜ける」ってのは、たまに必要になることがあるけれど、たいていは「どこかで設計ミスしてる」ことが多い... ってのは、思考がCに毒されているからなのかね。それが「毒されてない」とするなら、
> こんなへたくそなプログラムは人様には見せられない
なんてのは、ある種必然かなと。
おごちゃん、おひさしぶり〜。見ていてくれたんですね。僕も、おごちゃんのブログは見てますよ。
日経mix(懐かしい)で議論していた頃ほど、こういうところへのこだわりはなくなりましたねぇ。だんだんどうでもよくなってきました(^^; とか言いながら、「こんなの人前に出せないよ〜」とか言っているやつ。
どもども^^;
最近は... つーか、MIX以後は「言語の仕様なんてどーでもいーじゃん」とか思ってプログラム書いてます。それがどれだけ建設的な議論であっても、不毛感がぬぐい去れない... ってのは、そのうち日記に書きます。
そう思いながらも、なぜかCOBOL言語委員だったりするんだよね。