プログラマーの人教えてくださいっ!


プログラムで初心者とか(初心者じゃなくても)が間違えやすいコーディングミスのあるあるみたいなのを沢山知りたいです。

例えば、ループで終了条件を間違えて無限ループになっちゃったりとか、
==とふたつ書かないといけないのに=をひとつにしちゃったりとか
()を付け忘れて、変な条件判定になっちゃったりとかです。

なに言語でもいいんですけど、
正しいコードと間違ったコード、間違った結果どういうふうになっちゃうかを教えてくれたら嬉しいですっ

コーディングミスあるあるみたいなのです
コンパイルエラー? にはならなくて、動くけど間違って動くやつを教えてください

よろしくお願いします。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2013/06/28 12:39:31
  • 終了:2013/07/04 09:43:17

ベストアンサー

id:Sampo No.5

Sampo回答回数556ベストアンサー獲得回数1042013/07/03 01:37:47

ポイント40pt

レースコンディションをご存じなかったようなのでご紹介しておきましょう。

なにかデータ処理があるとします。
データを見て、判断して、判断結果でデータをいじります。
で、この一連の流れの間にもしデータがいじられてしまったら、処理の結果は大混乱してしまいます。

(よく例えに引かれるのが銀行口座です。1000円引き出したいとき、【口座の残高を確認】→【それが1000円未満ならエラー終了】→【エラー出なければ先ほど確認した残高から1000減らした値を書き込む】という処理。
残高を確認したときには2000円あったのに、書き込むまでの間に他のATMで2000円下ろされていた(残高0円になっていた)ら…? 「1000円」という結果を書き込んでしまい、お金が増えてしまうことになります)

このように、作業中は机の上をいじられたくないのに、机を守り切れずにおかしな結果になったのがレースコンディションです。

ゲームだとたまに、アイテムをせーので同時に売買したときにアイテムの数がおかしくなるバグがあったりしますね。

数が狂うだけならまだましで、データがおかしくなるせいで処理が暴走してサービス停止だってありえます。

id:doumorimikan

おおっ! こういう名前がついてるって知りませんでしたっ!
ありがとうございます。

2013/07/03 10:24:58

その他の回答(4件)

id:a-kuma3 No.1

a-kuma3回答回数4441ベストアンサー獲得回数18252013/06/28 13:23:02

ポイント45pt

昔の有名なやつをひとつ。

    switch (n) {
      case 1:
        ...
        break;

      case 2:
        ...
        break;

      defualt:
        ...
        break;
    }

どうしても、デフォルトの処理が動かないんですよお、というやつ。
今どきの統合環境を使ってる人なら、はまらない(多分)。
正しくは、こう。

    switch (n) {
	  ...

      default:      /* default のスペルを間違ってた */
        ...
        break;
    }

文字列+コロンは、ラベルという goto の飛び先として文法上許されている書き方。
switch には default が無くても OK という罠。




あまりに古い気がしたので、もう少し新しいもの(と言っても、古い)。
PHP とか JSP とかみたいに、HTML の中に処理を埋め込めるタイプで、初心者がはまるやつ。

<form>
	<input name=comment value=<?= $value ?> >
	...
</form>

変数 $value が空白を含んだ値だと、HTML はこう展開されちゃう。

<form>
	<input name=comment value=Hello World >
	...
</form>

value=Hello だと扱われて、空白より後が紛失の憂き目に。

正しくは、こう。

<form>
	<input name="comment" value="<?= $value ?>" >
	...
</form>

こう展開される。

<form>
	<input name="comment" value="Hello World" >
	...
</form>
他4件のコメントを見る
id:a-kuma3

求めてた方向とは違っちゃってます。

「ソースコード」っぽいのが所望、ということですか?

2013/06/28 13:54:19
id:doumorimikan

えっと、ソースもそうですけど、
ループが終わらない! とか 思ってたif文に入らないとか、
わかりやすい誤動作するのがいいです。

なんかそういうバグのあるゲームしてたら、どの選択肢を選んでも死んじゃうとか、
延々と同じシーンが繰り返されるとかなんかそんなの

2013/06/28 14:31:02
id:holoholobird No.2

holoholobird回答回数574ベストアンサー獲得回数1042013/06/28 14:31:16

ポイント5pt

なんか文中の記号がはてな記法に引っかかるようなので、引用記号で囲みます。

・Iとl、mとn、意外とわからないDと0、pとqなどのスペルミス。
回答1のようなものも含みます。

特にこの手のエラーは発見が難しいので、コードエラーになると困ります。

・intやfloatなど、データ型を混合しすぎて桁落ちなどのエラーが起こる

・コメントアウトのし忘れ。
言語によってコメントアウトの記号を混用したりするケース。

//と<!--、/*を間違えるなどです

・if (a = b)とif (a == b)の混用。
前者はbをaに代入するだけなので、常に真になります。

等号ひとつ漏らすだけで一日エラーの原因探したこともあります。

・いらないと思って消した関数が実は重要なものだったケース

コメント化してもコードが見にくくなるので、
消してさっぱりして後で気が付くタイプのミスです。

id:cno No.3

cno回答回数124ベストアンサー獲得回数122013/06/28 21:19:49

ポイント5pt

最初に習うプログラム言語がJavaで、慣れないうちは
文字列の比較で??となる方は多いんじゃないでしょうか??(細かいnullチェックとかは省いてます)

例えばこんな感じで
String a="hello";
String b="hello";

if(a==b){
//ここには来ない
}

*正しくは
if(a.equals(b)){
//ここには来る
}

id:doradoratan No.4

doradoratan回答回数67ベストアンサー獲得回数152013/06/29 12:46:15

ポイント5pt

データ例外的なのが一番多いのでは。

例えば、割り算で変数に0が来ちゃった場合

a = 2
b = 0
X = a / b ←ここでエラー

当たり前ですが、入力されたデータを事前にチェックすることで回避できますね。

id:Sampo No.5

Sampo回答回数556ベストアンサー獲得回数1042013/07/03 01:37:47ここでベストアンサー

ポイント40pt

レースコンディションをご存じなかったようなのでご紹介しておきましょう。

なにかデータ処理があるとします。
データを見て、判断して、判断結果でデータをいじります。
で、この一連の流れの間にもしデータがいじられてしまったら、処理の結果は大混乱してしまいます。

(よく例えに引かれるのが銀行口座です。1000円引き出したいとき、【口座の残高を確認】→【それが1000円未満ならエラー終了】→【エラー出なければ先ほど確認した残高から1000減らした値を書き込む】という処理。
残高を確認したときには2000円あったのに、書き込むまでの間に他のATMで2000円下ろされていた(残高0円になっていた)ら…? 「1000円」という結果を書き込んでしまい、お金が増えてしまうことになります)

このように、作業中は机の上をいじられたくないのに、机を守り切れずにおかしな結果になったのがレースコンディションです。

ゲームだとたまに、アイテムをせーので同時に売買したときにアイテムの数がおかしくなるバグがあったりしますね。

数が狂うだけならまだましで、データがおかしくなるせいで処理が暴走してサービス停止だってありえます。

id:doumorimikan

おおっ! こういう名前がついてるって知りませんでしたっ!
ありがとうございます。

2013/07/03 10:24:58
  • id:wild_yamato
    これを知って、どうするのだろう?
  • id:Sampo
    小説のネタとかですかね。

    バッファオーバーフローとかメモリリークとかレースコンディション、デッドロック、みたいなパターン名のついた誤りも紹介したかったんですが簡単なコードで紹介しづらいんですよね。
  • id:doumorimikan
    みかんっ 2013/07/02 12:55:53
    Sampoさんっ ありがとうございます。

    オーバーフローもリークもデッドロックもいい感じですっ

    レースコンディションは知りませんでしたっ

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません