C言語の設計ミスった危険な関数トップ10決めようぜ (215レス)
上下前次1-新
1(3): 2019/11/21(木)12:23 ID:T7Jjyyy1(1)調 AAS
gets関数とか
その他の例
https://www.jpcert.or.jp/sc-rules/c-msc24-c.html
2: 2019/11/21(木)15:39 ID:IZBPdnFY(1)調 AAS
Anal
3: 2019/11/22(金)14:16 ID:TbHXN4jn(1)調 AAS
当時の設計なら、gets の仕様はああなる。
4: 2019/11/22(金)14:46 ID:vYD7HZZ7(1/2)調 AAS
gets()をゲッツ、puts()をプッツと読んでたな
5(3): 2019/11/22(金)14:53 ID:eCK2aX+t(1)調 AAS
strtokの読み方で出身地が分かる
6: 2019/11/22(金)15:15 ID:vYD7HZZ7(2/2)調 AAS
>>5
それはストアトークと読んでた
7(1): 2019/11/23(土)04:11 ID:l4WHmfnE(1)調 AAS
最大のミスは、文字列そのものをデータ型としては持たずに、
文字列はヌルで終端された不定長の文字の配列であるとしたことにある。
8: 2019/11/23(土)06:08 ID:eMnkZzKn(1)調 AAS
どうすれば良かった?
9: 2019/11/23(土)06:14 ID:GXkG1Oic(1)調 AAS
関数だっつうてんのに
10: 2019/11/25(月)21:55 ID:E+NtJXA3(1)調 AAS
scanfだろjk
11(1): 2019/11/26(火)04:12 ID:As19A6dg(1)調 AAS
putchar()はプッチャーと読んでいた
12: 2019/11/26(火)12:29 ID:dAEqoOXB(1)調 AAS
scanf
strtok
feof
13: 2019/11/26(火)20:24 ID:feqSm/53(1)調 AAS
C言語の関数名ってまだリンカがシンボルの先頭から6文字までしか認識しなかった頃の名残だしな
変な短縮形が多い
14: 2019/11/27(水)03:05 ID:nQw9n1Di(1)調 AAS
strcpy()とか意図しようがしまいが簡単にメモリをぶっ壊せる
よくよく考えるとキチガイ過ぎる
15(2): 2019/11/27(水)12:17 ID:zdI/1sLa(1)調 AAS
C言語に安全性を求めるのは違う
16: 2019/11/27(水)12:31 ID:KtqS+hCI(1)調 AAS
time
localtime
17: 2019/11/27(水)13:15 ID:MN5dlGGA(1/2)調 AAS
>>15
ほんそれ
18(1): 2019/11/27(水)13:50 ID:pAkxzJaX(1)調 AAS
>>15
根本的な所を勘違いしてる。
C言語で安全性が求められないからと言って、
C言語で作ったアプリには安全性は求められるだろ?
例えば、getsは安全に使うことが不可能なんだよ。
19: 2019/11/27(水)14:42 ID:MN5dlGGA(2/2)調 AAS
大昔に出来た関数なんだから多くを求めるな
20: 2019/11/30(土)20:36 ID:4Da+M2q+(1/2)調 AAS
>>11
俺はプッキャーだった
21: 2019/11/30(土)20:38 ID:4Da+M2q+(2/2)調 AAS
>>18
> 例えば、getsは安全に使うことが不可能なんだよ。
ならgetsを使わずにgetcでやればいいだけ
22: 2019/11/30(土)21:25 ID:vRr1Hx4s(1)調 AAS
安全は考えないで設計したのでミスってはいない
23: 2019/11/30(土)22:19 ID:Zwer7NNs(1)調 AAS
アブドーラ・ザ・プッチャー
24: 2019/12/01(日)10:49 ID:uAQAPMuh(1)調 AAS
組み込みでC言語は使うけど、10個以上の標準関数って使わないな...。
25(1): 2019/12/01(日)12:47 ID:p3Z7Nr0h(1)調 AAS
memcpy / memset / memcmp
strlen / str(n)cpy / str(n)cmp / str(n)cat
これで10個
26(1): 2019/12/01(日)13:17 ID:W5IIwakz(1)調 AAS
組み込みで文字列扱わないことも多いね。
どんな製品でもほぼ使うのはmemset、memcpy、memcmpぐらいじゃない?
27: 2019/12/01(日)17:41 ID:YWi4MX0G(1)調 AAS
>>25
>>1のリンク先より
未チェックの時代遅れの関数
以下の関数を、未チェックの時代遅れの関数と定義する。
memcpy, strcpy, strncpy, strcat, strncat (一部抜粋)
半分あてはまってるなw
>>26
memcpyは危険なので使うのはやめましょう
28(1): 2019/12/01(日)20:53 ID:IKYJT3WJ(1)調 AAS
C言語ではなく標準ライブラリの話かい。
29: 2019/12/01(日)21:25 ID:7gLQ63yc(1)調 AAS
アセンブラより安全なら良いじゃん
30: 2019/12/02(月)00:51 ID:RIgVO6ZZ(1/2)調 AAS
memcpyが危険とか言うなら
C言語使うなってことになる
31: 2019/12/02(月)00:53 ID:RIgVO6ZZ(2/2)調 AAS
>>28
標準じゃない関数だと...
失敗談みたいなのを期待してた?
32(1): 2019/12/02(月)02:04 ID:AAYR8Yqw(1)調 AAS
>>1
セキュリティ考慮していない元関数より、代替関数の設計ミスが酷いな
strtodとかなにこれw
エラーの返し方がアホすぎる
33: 2019/12/02(月)06:48 ID:kJrDK+4B(1/2)調 AAS
>>32
> strtodとかなにこれw
> エラーの返し方がアホすぎる
そう言うのは改善案を提案しないと単なるアホの独り言にしかならんぞw
34: 2019/12/02(月)13:15 ID:EYnQFBh2(1/2)調 AAS
一体どういう考えで昔の人は、getsの仕様はあれでOKだと思ったんだろう?
どう考えてもバッファオーバーフローするやん?
しない方法なんて存在するの?
35: 2019/12/02(月)13:18 ID:xJykAg3Z(1)調 AAS
バッファオーバーフローしないデータを食わせれば良い
わざわざ変なデータを入力するヤツが悪い
って考えの時代の関数だ
36(2): 2019/12/02(月)13:41 ID:EYnQFBh2(2/2)調 AAS
でもさ、getsってキーボード入力やろ?
37: 2019/12/02(月)15:30 ID:LC/c96JG(1)調 AAS
gets は、もう、標準ライブラリにも入っていないので許せ
38: 2019/12/02(月)18:02 ID:kmSxls5X(1)調 AAS
>>36
わざわざ変なデータを入力するヤツが悪い
39: 2019/12/02(月)18:41 ID:E2hgf+6B(1)調 AAS
ダンディ坂野「gets!!」
40(1): 2019/12/02(月)20:50 ID:kJrDK+4B(2/2)調 AAS
>>36
1行80文字とかって決め打ちできる環境なんでしょ
自分しか使わないようなツールとかならこれで十分
って考え
41(2): 2019/12/03(火)01:51 ID:dBsSbed7(1/2)調 AAS
8ビットの整数型を char などというものにしたのも、アメリカ人は
自分たちの英語しか知らない田舎者であることを如実に表している。
42: 2019/12/03(火)09:14 ID:yN5r9ueQ(1)調 AAS
>>40
64kbでも広大な空間だったな
43: 2019/12/03(火)12:22 ID:90Sp73uq(1/2)調 AAS
>>41
実に田舎者の考え方で笑える
逆だよ、都会の人間は都会のことしか知らないし知る必要がない
なぜか田舎の人間は都会のことも知ろうとするw
44(1): 2019/12/03(火)12:29 ID:Uh1tIUQA(1)調 AAS
> 逆だよ、都会の人間は都会のことしか知らないし知る必要がない
だから世界が狭くて無知になりやすい
> なぜか田舎の人間は都会のことも知ろうとするw
だから世界が広い
45: 2019/12/03(火)12:51 ID:dBsSbed7(2/2)調 AAS
井の中の蛙 大海を知らず
されど空の蒼さを知る
46(1): 2019/12/03(火)13:25 ID:g2sdmHcp(1)調 AAS
C言語が出来た時の時代を考えれば十分
「変数名に日本語が使えない言語は糞」
って時代もそのうち来るよ
47: 2019/12/03(火)19:14 ID:90Sp73uq(2/2)調 AAS
>>44
残念ながらそうはなってないんだなw
狭く深くっていう世界だから
要するに田舎でな何をするにもオーバーヘッドが大きいってことな
今はネットでだいぶマシになったけどネット以前の情報収集考えたらアホでもわかる話
48: 2019/12/08(日)02:33 ID:aqWVKWA+(1)調 AAS
アホなデータ食わせるアホなやつのために堅牢な仕組みにする必要はない
49: 2019/12/11(水)01:29 ID:7IDmuKiG(1)調 AAS
>>41
元々は9bit
50: 2019/12/11(水)06:55 ID:IbA4V9X0(1)調 AAS
>>46
メモリが640kバイトしか使えなかった頃からのものだしな
51: 2019/12/11(水)07:59 ID:yA/FdCBI(1)調 AAS
>>5
ストラトック
52: 2019/12/11(水)15:20 ID:JkExA39E(1)調 AAS
大昔って端末やエディタなんかでも1行256とか1024バイト程度しか扱えなかったばず
53: 2019/12/11(水)15:32 ID:8OP/pbId(1)調 AAS
256 の時代は割と長かった希ガス
54: 2019/12/13(金)06:37 ID:o1f1J6fH(1)調 AAS
昔は1行の長さを先に決めてファイルをクリエイトしました
途中で変更はできません
55: 2019/12/14(土)13:26 ID:TlZt0bii(1)調 AAS
関数そのものじゃないが
breakにラベル指定出来なかったのは設計ミスやろ
56: 2019/12/14(土)13:54 ID:JwYnIOEa(1/2)調 AAS
その為のgoto
57(8): 2019/12/14(土)22:43 ID:8CJijD11(1)調 AAS
gotoはラベルのスコープが広いから使いにくい。ループごとに別のラベル名を
付けないといけないし、ラベル名を別のループ用のものと書き間違えると
意図しない所へ飛んで行ってしまう。スパゲッティでバグの元。
ループにラベルを付ければ、スコープがそのループ内に限定され、そのループの
外にある別のループに同じラベル名を付けることができるから、書きやすく
読みやすい。例えば、こんな感じ。
for @outer (i = 1; i <= 3; i++) {
for (j = 1; j <= 3; j++) {
printf("%d, %d\n", i, j);
if (i * j > 3) break @outer;
}
}
for @outer (i = 1; i <= 5; i++) {
for (j = 1; j <= 5; j++) {
printf("%d, %d\n", i, j);
if (i * j > 5) break @outer;
}
}
58(1): 2019/12/14(土)22:45 ID:JwYnIOEa(2/2)調 AAS
単純に
breakする数を指定出来るだけで良い
59: 2019/12/15(日)06:50 ID:6aWNd1w0(1/2)調 AAS
>>58
ネストの数を数えるとか最低だと思う
60(1): 2019/12/15(日)07:00 ID:a0yEED8b(1)調 AAS
1000行のコードでbreak 7;とかされても、
どこに抜けるかわからんよな!
61(1): 2019/12/15(日)09:51 ID:5sPbacoo(1/8)調 AAS
ネストの数がわからないような巨大な構造は
それだけで最低だ
そんなんだと名前付きループにした所で
@outerなんて名前が使い回されて
同じ名前のループがネストされて
それこそ難読コードになる
それならユニークなラベルによるgotoの方が良い
>>57くらいのループなら
break 2;
は名前を考える手間が無くて楽だし
見にくくもない
62: 2019/12/15(日)09:57 ID:5sPbacoo(2/8)調 AAS
とは書いたけど
どっちも有るならどっちも欲しい
どっちかだけげならbreak 2;の方が欲しい
って感じ
63: 2019/12/15(日)10:52 ID:6aWNd1w0(2/2)調 AAS
>>61
> そんなんだと名前付きループにした所で
> @outerなんて名前が使い回されて
> 同じ名前のループがネストされて
> それこそ難読コードになる
無能の妄想w
64(1): 2019/12/15(日)11:05 ID:5sPbacoo(3/8)調 AAS
ループの先頭、ループの終わり、break部分
3箇所見ないとダメってだけでダメな仕様
65: 2019/12/15(日)12:32 ID:bDjAMWVj(1/2)調 AAS
>>64
なぜか自分の前提は
> >>57くらいのループなら
なのにラベルにした途端にループの頭とbreakとループの終わりが一瞥でわからないとかアホすぎ
66: 2019/12/15(日)12:36 ID:5sPbacoo(4/8)調 AAS
大きければgoto
小さければbreak n
67(1): 2019/12/15(日)12:38 ID:5sPbacoo(5/8)調 AAS
名前を付ける手間を許容するならgotoという解決法が既にある
68: 2019/12/15(日)13:48 ID:o9m7qUoD(1)調 AAS
>>60
ネスト変わるような変更あるたびにbreakの引数勝手に書き換えてくれるエディタとかマクロが流行る
69: 2019/12/15(日)16:33 ID:bDjAMWVj(2/2)調 AAS
>>67
ifとgotoあるからforもwhileもdoも要らんという主張か
本物のプログラマーだなw
70: 2019/12/15(日)16:52 ID:u46gpj2V(1)調 AAS
歪んだ教育のせいで
gotoに拒絶反応を示す人が多いんだよな
2重ループを抜けるなら素直にgotoを使えって
71: 2019/12/15(日)16:53 ID:pTp+dpJs(1)調 AAS
アセンブラの
jmp 1f
とかを C でやりたいという話なのか?
やってみりゃいいじゃん。プリプロセッサの出力を処理すればいい。
1 パスで出来ると思うよ。
ひょっとしてもう誰かがやってるかも。
72(1): 2019/12/15(日)18:05 ID:5sPbacoo(6/8)調 AAS
for (i = 1; i <= 3; i++) {
for (j = 1; j <= 3; j++) {
printf("%d, %d\n", i, j);
if (i * j > 3) goto outer;
}
} outer:;
73(1): 2019/12/15(日)18:58 ID:5sPbacoo(7/8)調 AAS
for (i = 1; i <= 3; i++) {
for (j = 1; j <= 3; j++) {
printf("%d, %d\n", i, j);
if (i * j > 3) goto outer;
}
}
printf("complete\n");
outer:;
74: 2019/12/15(日)19:01 ID:5sPbacoo(8/8)調 AAS
わざわざ言語拡張しなくても
>>57以上の事が実現出来る
75: 2019/12/16(月)09:05 ID:AI1GDY0I(1)調 AAS
ラベルのスコープを狭くしたいという話のようだから
マクロの中で使ってこそ真価を発揮するんじゃないかな。
フル仕様のパースが必要というわけではなく、かなり手抜きできそうではある。
あれば便利というのは否定しないが、C でそこまで必要かというと…
76: 2019/12/16(月)12:33 ID:0jmxiGrg(1)調 AAS
{
goto hoge;
hoge:;
}
{
goto hoge;
hoge:;
}
これで二重になってたら困るしある意味なってなくても困るな
77: 2019/12/16(月)13:21 ID:ZZ8St2Js(1/3)調 AAS
マクロで二重以上のループってのもなかなか考えづらいなあ
一応、ラベル名をパラメータとする手もある
使う側のコストを考えるとgotoの為にパラメータを増やさないよな
gotoを使わない主義者がよくやってるように
余分な変数を使って実装するんだろうね
78: 2019/12/16(月)13:23 ID:ZZ8St2Js(2/3)調 AAS
アセンブラだとマクロローカルラベルってのがあったりする
ラベルを頻繁に使うので
あと
@@/@b/@fのように、
直近のラベルを指定する仕組みもある
79: 2019/12/16(月)13:28 ID:ZZ8St2Js(3/3)調 AAS
>>72 >>73 みたいなのって
gotoの使いどころだと思うんだけだ
gotoを使わない人はどう書いてるの?
特に >>57 の答えを聞いてみたい
80: 2019/12/16(月)15:17 ID:arH1mwfY(1/13)調 AAS
void print_data(void) {
for (i = 1; i <= 3; i++) {
for (j = 1; j <= 3; j++) {
printf("%d, %d\n", i, j);
if (i * j > 3) return;
}
}
}
print_data();
printf("complete\n");
81: 2019/12/16(月)16:34 ID:/0yHEQmX(1)調 AAS
outer より後に処理が続く場合は?
82(2): 2019/12/16(月)16:51 ID:arH1mwfY(2/13)調 AAS
void print_data(void) {
for (i = 1; i <= 3; i++) {
for (j = 1; j <= 3; j++) {
printf("%d, %d\n", i, j);
if (i * j > 3) return;
}
}
}
print_data();
outer より後に処理が続く場合
printf("complete\n");
83: 2019/12/16(月)16:55 ID:arH1mwfY(3/13)調 AAS
"短い処理"をいちいち関数にしなくて済むから、break 2とかはあってもいいが、
長い処理は関数にしてないとろくにテストできないんだからgotoなんていらない
84: 2019/12/16(月)19:03 ID:4DgO9d+i(1)調 AAS
じゃあ>>57もいらないね
85: 2019/12/16(月)19:09 ID:lsrBHsJG(1)調 AAS
gotoの基本的な使い方くらい知っておいた方が良いかと
ループを抜ける為だけに関数を分けないといけなくなるし
挙げ句の果てに言語の欠陥とか言い出す
86: 2019/12/16(月)20:06 ID:3ha1TSe5(1)調 AAS
今のC言語ではネストしたループから抜けるのはフラグを使うかgotoしかないからたいていgoto使ってるけどgotoなんて野蛮なものはできたら使いたくないから他の言語で実装されてるラベル付きbreakなりレベル付きbreakが欲しいって話だろ
今更gotoの基本的な使い方ガーとか言ってる奴はどんだけ低レベルなんだよw
87(1): 2019/12/16(月)20:09 ID:xr9KOlE0(1/17)調 AAS
あれ?
returnで抜ける為に関数に分けるんじゃなかったの?
88: 2019/12/16(月)20:21 ID:xr9KOlE0(2/17)調 AAS
gotoは野蛮とかいう歪んだ教育のせいで
わざわざ変数を定義したりわざわざ関数を分けたりして
わざわざ見にくいコードにしちゃう
生でポインタを扱う野蛮なC言語なんか使わないで
上品な言語を使った方が良いよ
89: 2019/12/16(月)20:28 ID:jL52ryYk(1/2)調 AAS
gotoじゃなくてgodowntoなら誰も文句言わなかった
90: 2019/12/16(月)20:47 ID:LjjtFzBx(1/4)調 AAS
自分は小規模な字句解析みたいなのでもgoto使うことがある。
ラベルで状態を表してgotoで遷移する。
goto使わなかったら状態を変数に入れて、
ループの中でswitchで場合分けするようなコードになって辛い。
91: 2019/12/16(月)20:52 ID:DbnQVwfE(1)調 AAS
ループの中のswitchでループを抜けるのに
gotoを使うんじゃ?
上下前次1-新書関写板覧索設栞歴
あと 124 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.024s