トップページ⇒tech
781コメント248KB

あなたのまわりの糞コード

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
糞すぎて、ある意味美しさすら感じるようなコードを見せてクレー
(身元がばれない程度に)
0002デフォルトの名無しさんNGNG
int a[16];
for( int i=0; i<=16; i++){
 a[i]=.......
}

デバッグさせられる方の身にもなってみろ……
0003デフォルトの名無しさんNGNG
>>2
まぁ、そもそも即値なのがまずいのかもしれないけど、
ローカルだったら許せなくも無いレベルかなぁ。すぐ気づくでしょ。
境界関係はデバッグ時の優先チェック項目だよね。

0004デフォルトの名無しさんNGNG
>>3
#define array_sizeof( array ) ( sizeof( (array) ) / sizeof( (array[0]) ) )
を使うとか。
00053NGNG
>>4
うん、私はそういう感じにしてます。
でも2の場合の直接の問題は < と <= だからねぇ。
0006デフォルトの名無しさんNGNG
境界侵犯関係の調査は、PURIFYとかBoundsChecker使うのが楽。
リークしてないのにリークと報告するような事もあるけど、
メモリアクセス上のバグを沢山自動検出してくれるのはありがた
いっすよ。
0007デフォルトの名無しさんNGNG
>>3
ちなみにJavaなら、実行した瞬間にRuntime例外が飛んでくれて、
スタックのトレースはいてくれるので、楽チン。
0008C#NGNG
ボクもだぞ!
0009PerlNGNG
勝手に配列のサイズが増えちゃいます。テヘ。
0010PascalNGNG
var a: array [0..15] of Integer;
ってやるから、すぐ気づくんだよなぁ。
0011PascalNGNG
つーか、これがあった…
for i := Low(a) to High(a) do begin
 a[i] := ...
end;
0012あはは、NGNG
あなたのまわりの糞こおどぉー♪

歌っちゃったりなんかしてぇ〜・・・
0013デフォルトの名無しさんNGNG
Cはsizeofしかないからなあ・・
マクロ定義じゃウザクなるだけだし・・・
0014デフォルトの名無しさんNGNG
C言語でinlineキーワード使える処理系使えば?>13
32bitではVisualC++やBCC55、GCCとかかな。
16bit処理系で無い?
0015デフォルトの名無しさんNGNG
mallocしてfreeしないコード
0016ボログラマーNGNG
switch( n )
{
case 'A':
case 'B':
case 'C':
case 'D':
 switch( n )
 {
 case 'A':
 case 'B':
 case 'C':
 case 'D':
  ......
  break;
 }
 break;
}
無駄に2重switch。
・・・いや、だから何がしたかったんだ?
0017デフォルトの名無しさんNGNG
>>15
freeしてmallocしないコード
0018デフォルトの名無しさんNGNG
>>17
mallocを知らなくて何でもかんでもstaticに取るコード
0019みんな経験あるでしょNGNG
Cしか知らない奴がはじめて書いたC++/Javaのコード。
0020デフォルトの名無しさんNGNG
>>19
う、耳が痛い。
0021デフォルトの名無しさんNGNG
f(); /* fを呼ぶ */
0022デフォルトの名無しさんNGNG
count--; /* カウントアップ */
0023デフォルトの名無しさんNGNG
配列を知らないのか、n_00〜n_13までの14個の引数を
ずらずら書き連ねた関数の宣言。客先で倒れるかと思った。

作ったのは下請けの新人らしい。
0024デフォルトの名無しさんNGNG
#define _
for (;_;) {
...
0025デフォルトの名無しさんNGNG
「リファクタリング」には糞コードの実例(とその改善方法)が
山のように載ってるな。
0026デフォルトの名無しさんNGNG
お約束サイト: 「いかにしてメンテナンス不能なコードを書くか」 http://mindprod.com/unmain.html
0027デフォルトの名無しさんNGNG
メンテナンス不要じゃないのね・・・・
0028デフォルトの名無しさんNGNG
>>26
面白かった。ありがとう。
LISP is a dream language for the writer of unmaintainable code.
てのがワラタ
0029デフォルトの名無しさんNGNG
p++; // ポインタをインクリメント
0030デフォルトの名無しさんNGNG
for( i = 0; i < 10; i+=1)
0031デフォルトの名無しさんNGNG
>>29
え?だめなの?
int i, val[100], *p;
p = val;
for( i = 0; i < 100; i++, p++)
  *p = 0;
とかやんない?
この場合はインデックス使った方が良いけどさ。
0032デフォルトの名無しさんNGNG
>>31
>>29のは、しょうもない無意味なコメントを書くなってことだろ
0033デフォルトの名無しさんNGNG
>>31
おばか?
あんたもしかしてこんなコードかくでしょ

#include <stdio.h> /* stdio.h を include */

main() /* main関数 */
{
  int i = 0; /* int 型 i を宣言、値を 0 にする */

  for(i = 0; i < 10; i++) /* i を 0 から 9 までインクリメントする for 文 */
    printf("hello, world\n"); /* hello, world を printf する */

}

うざぃ。
0034デフォルトの名無しさんNGNG
uchar i;
for (i = 0; i < 256; i++) ...
0035デフォルトの名無しさんNGNG
>>34
always true な Warning 出ないっけ?
0036名無しさん@1周年NGNG
// 機能: データに値をセットします。
//
extern void PutData(int *data);
0037名無しさん@1周年NGNG
public class HandlerBase implements ...{
...
}

DOM/SAX 系 API は全部苦ソ。
0038デフォルトの名無しさんNGNG
以前、この板で見たコード。

for(i = 0; i < strlen(s); ++i)
...

for の条件判定の中で strlen を使うなよと思った。
0039デフォルトの名無しさんNGNG
マァマァ掲示板のコードはロジックにとどめて最適化は各自がするってことで
0040デフォルトの名無しさんNGNG
>>38
なぜ? 説明してね(はぁと)
0041デフォルトの名無しさんNGNG
strlenが毎回実行されるってこと?
0042デフォルトの名無しさんNGNG
38>>41
そうだよ。
0043マジデNGNG
>>37
DAMN/SUCKS 系 APE とは何でござるか?
0044デフォルトの名無しさんNGNG
>for の条件判定の中で strlen を使うなよと思った。

vector<むにゃむにゃ> vec;
vector<むにゃむにゃ>::iterator iter;

for (iter = vec.begin(); iter != vec.end(); iter++) {
 :
}

どう思う?
0045デフォルトの名無しさんNGNG
vec.end()は明らかに軽いので問題なし。
strlen()は明らかに重いので問題あり。
0046デフォルトの名無しさんNGNG
>>44
それはふつうの書き方だと思う。

forの中の strlen()は、そもそもforループ自身が文字列を頭から
順番になめる処理なのに、同じような処理を行うstrlenをループごと
に毎回実行していて、気持ち悪すぎ。
0047デフォルトの名無しさんNGNG
こういう玄人のグチを聞いて、素人はレベルアップしていくわけです。
0048デフォルトの名無しさんNGNG
>>47
この程度の事でいちいち玄人扱いしちゃいかんとおもう。
0049デフォルトの名無しさんNGNG
while(1){
 ..
 if ((err = func()) != NOERROR)
  break;
 ..
 if ((err = func2()) != NOERROR)
  break;
 ..
 break;
}
 if (err){
 ..
 }
 ループではないのです。
 関数分ければいいのに...

0050デフォルトの名無しさんNGNG
returnは関数内で一個だけ!とかいう、
脳梗塞糞馬鹿SEの氏んで欲しい仕様の犠牲者ですね、その関数。
大手いくとたまにそんなあほな仕様が標準化されてるんだよね。
0051デフォルトの名無しさんNGNG
あと、なにが何でもGOTO禁止!とかもルールにあるみたいだね。
アホか!と思うが。おいらならせめてこう書く。goto使っても
分かりやすくてよみやすい方がいいと思う。

if(func()) goto err;
if(func2()) goto err;

return;

err:
//ERROR処理
return;
0052真のプログラマは PASCAL を使わないNGNG
真のプログラマは、GOTOの使用を恐れない。 ??
0053デフォルトの名無しさんNGNG
>>49
その書き方はCマガのあっぱれご意見番(だったかな?)で紹介されてたな。
51のような、エラー処理をgotoで飛ばす書き方の代用だそうだ。
(その後、読者からdo{}while(0)を使ったほうが良いとか指摘されてたな。たしか)
0054デフォルトの名無しさんNGNG
エラー(例外)処理へのgotoなら許す!
0055デフォルトの名無しさんNGNG
>>51 プログラマと呼ばれている人たち全てが君のレベルまで達していれば
それでもいいんだけどね。
0056デフォルトの名無しさんNGNG
try{
 func();
 func2();
}
catch(Error e){
 //error processing
}

C++風に書こうよ。
005751NGNG
>56
そりはC++かJavaの時でないと…
Cの最近の言語仕様にはtry、catchあるのかな?
知らんかった。ちょっとうれしい。
0058デフォルトの名無しさんNGNG
Cでは無理です。>57
0059デフォルトの名無しさんNGNG
ねえよ>57
0060デフォルトの名無しさんNGNG
Javaなら、こういう話の流れではやはりラベル付きbreakを…
0061>NGNG

こんなの
if (!func1() || !func2() || ....) {
しっぱいしちゃった...
}
でいいじゃん。

gotoを使うことは恐れないが、最初っからgotoを使いたくなるような
状況に陥らないのが達人。間抜けに「gotoを恐れるな」とか教えると
エラー処理ごときでも乱用するからたまらん。
006251NGNG
>61
異常処理が全部共通ならそれで十分だね。スマソ。
でも関数を10個20個コールしていて、異常処理が3、4パターンくらい
とかいう時には、gotoつかうのが一番すっきりしそうだと思うんだけど。
0063デフォルトの名無しさんNGNG
あるいはエラー発生位置を知る必要があって、なおかつエラー発生位置用の
グローバル変数など使いたく無い場合とか
0064デフォルトの名無しさんNGNG
そういえば真紀大先生が昔Cマガでthrow, catch風の
Cのマクロの実装を大威張りで解説してたな。

もっと昔にha例外処理なんてよっぽど
大規模なアプリ以外いらん。とも言ってたな。
0065デフォルトの名無しさんNGNG
あの人痛いよね。>64
あんなんで原稿料貰ってると思うと腹が立つのでこの話題はもうおしまい。
006661NGNG
>>62
そうなるとケースバイケースだね。大抵の場合はうまくサブルーチン
分割できると思うけど、状態機械みたいなのを書いてるときはgotoの
ほうがすっきりすることも多い。

0067名無しさん@1周年NGNG
>>43
X-ML のスレッドを解析&構築するための API。
0068デフォルトの名無しさんNGNG
>>66
状態機械の場合は、状態遷移表を書いて
その表の通りに処理するようにかけば
gotoはいりませんよ
0069一生懸命探す奴NGNG
extern unsigned short table[];
// table[0x2121] = 0x8140; のような、128KBの変換テーブルが作ってあると思ってくれ。

unsigned short JIStoSJIS(unsigned short jis)
{
  return table[jis];
}

unsigned short SJIStoJIS(unsigned short sjis)
{
  unsigned short jis;
  for (jis = 0x2121; jis < JIS_MAX_CODE; jis++) {
    if (table[jis] == sjis)
      return jis;
  }
}
0070デフォルトの名無しさんNGNG
>>36
関数の宣言に extern を付けるのがダメってことだよね。
0071デフォルトの名無しさんNGNG
>>70
いやメソッドの先頭が大文字だからだ
Javaみたく「putData」にすべきだ
0072デフォルトの名無しさんNGNG
あまり大した事は無いが、
unsigned int Hogehoge() {
0073デフォルトの名無しさんNGNG
あまり大した事は無いが、
unsigned int Hogehoge() {
・・・
return -1;
}
と言うなら見たことがある。
0074デフォルトの名無しさんNGNG
つーか、WinAPIのヘルプに
BOOL InitApplication(HINSTANCE hinstance)
{
  …
  return RegisterClassEx(&wcx);
}
というコードがあるのだが。
確かにBOOLはintのtypedefだけど・・・
0075デフォルトの名無しさんNGNG
ちょっと話がずれるが
コピペを大量に使うことは駄目なのか??
コードを再利用してるんだから
いいと思うんだけど
なんか駄目みたいに言う奴がいるんだけど・・。
0076デフォルトの名無しさんNGNG
ソースレベルの切り貼りを「再利用」などと言わねぇって。
0077デフォルトの名無しさんNGNG
そのコピペしたコードが間違えてたら全部直すのか?
漏れがあったらどうする?人海戦術か?
0078デフォルトの名無しさんNGNG
コピペするくらいなら関数にして呼び出せば? ってことでしょ。
俺はあんまし守ってないけど。
0079デフォルトの名無しさんNGNG
あんま共通化すんのもなぁ・・
例えばAって関数をBとCから呼び出してるとして、
Bの仕様がちょっと変わってAを修正したとするじゃない。
そんときCもテストし直さなきゃなんないのが面倒くせぇの。
0080デフォルトの名無しさんNGNG
リファクタリング読
0081デフォルトの名無しさんNGNG
Bの仕様がちょっと変わったら、Bをちょっと修正すりゃーいいんじゃないのか?
たとえがよくわからん。
0082デフォルトの名無しさんNGNG
意味もなく class を使っている C++コード。
オブジェクト指向 じゃないのに、class を使っている。
C言語ユーザーが、オブジェクト指向という概念を勉強せずに、
言語の機能を使うとこういうことになる。
 むかしの私。
0083デフォルトの名無しさんNGNG
>>79
機能の切り分けとがまずいとか、そもそも設計で間違ってるとか、
そんなんじゃないのか?
008479NGNG
最初はBとCでおんなじ項目出力してたから出力部分を共通化してAにしてたけど
Bだけに出力項目が追加になったとか、そんな感じ。

あんま詳しく言えんけどなんか今やってんのそんなんばっか。
最初は同じような処理が多いんだけど、時間が経つとビミョーに
変わってくんの。
0085デフォルトの名無しさんNGNG
そんなん変更があった時点で、
Bから出力処理を呼び出すところを変えればいいじゃん。
始めは共通化しとくべきた。デバッグ面倒だろ?
0086デフォルトの名無しさんNGNG
#define THE_CARDINAL_OF_EMPTY_SETS 0
#define THE_FIRST_ENTITY_IN_THE_NATURAL_NUMBER THE_CARDINAL_OF_EMPTY_SETS
#define THE_ONLY_ONE_NUMBER_WHICH_CAN_BE_USED_TO_COMPUTE_SUCCESSIONS 1
#define succession(x) ((x) + THE_ONLY_ONE_NUMBER_WHICH_CAN_BE_USED_TO_COMPUTE_SUCCESSIONS)
int i;
for(i = THE_FIRST_ENTITY_IN_THE_NATURAL_NUMBER; i < 10; i = succession(i)) { ... }
0087デフォルトの名無しさんNGNG
あっ、CARDINAL じゃなくて CARDINALITY だったっけ…?
鬱だ氏のう
0088デフォルトの名無しさんNGNG
俺もこれくらいのコードは書きたい
http://www.ioccc.org/years.html
0089>88NGNG
素でそんなん書きたくない(;;
009079NGNG
>>85
そう。それで今までAを呼び出してた部分をやめて
AからコピペしたものをBに内包する。ほんでそこを直す。
Aを直すとCもテストし直さないとなんないから。
なんであんまり共通化されてない。ってこと。
0091デフォルトの名無しさんNGNG
float Aa, Ah, Av, Ac, Ax, Ay; /* constant of shikisa */
0092デフォルトの名無しさんNGNG
p>例えばAって関数をBとCから呼び出してるとして、
>Bの仕様がちょっと変わってAを修正したとするじゃない。
>そんときCもテストし直さなきゃなんないのが面倒くせぇの。

A自体の関数単体テストの結果が、両方の場合で同じなら
Cの再テストは必要無かろう。
分けるとはそういうこと。

ついでに、そういう場合は、
Bの変化に合わせてあげるのをA'とするなら、
Aはそのままで、Aを利用するA'を作るだろう。
または、被せる形でのA'が無理なら、
AとA'に共通した部分を抽出した(新たな)関数に
Aの役目をする(新たな)被せ関数と、
A'の役目をbする(新たな)被せ関数を作るもんじゃない?
どっちにしろAとしての振舞いに関しては、最初の段落の通り。
0093デフォルトの名無しさんNGNG
俺のPCの中に死ぬほどあるぞ。
0094デフォルトの名無しさんNGNG
でも、動けばいいやって思っちゃうときはあると思う
0095アマNGNG
他人の書いたコードなんてどうでもいいな。
009679NGNG
>>92
修正のたんびにそんなことしてたら関数いくつあっても
足りんよ(´Д`)
0097デフォルトの名無しさんNGNG
いまだに
1.変数名がVAR1000,VAR1010...
2.サブルーチン名がSUB1000,SUB1010...
3.ファイル名がPROG1000,PROG1010...
.
.
.
(泣)
0098デフォルトの名無しさんNGNG
表定義が
ABSASA
ABSBSA
ABSASB

更にその中の項目が
DATA001
DATA002
DATA003


しかも標準で決められる・・・
0099デフォルトの名無しさんNGNG
なんだその糞会社!糞標準!人間は機械じゃねえ!!
0100デフォルトの名無しさんNGNG
>>97-98
これなら変数名つけるのが楽だね。
見習おう。
0101デフォルトの名無しさんNGNG
大昔のメモリ不足時代の識別子文字数制限の遺物だね。
20年前なら標準でも仕方ないけど、今そんな
ケチなシステムってあんまりないはずだが…
■ このスレッドは過去ログ倉庫に格納されています