gets関数とか
その他の例
https://www.jpcert.or.jp/sc-rules/c-msc24-c.html
探検
C言語の設計ミスった危険な関数トップ10決めようぜ
2019/11/21(木) 12:23:44.93ID:T7Jjyyy1
2019/11/21(木) 15:39:01.67ID:IZBPdnFY
Anal
2019/11/22(金) 14:16:12.00ID:TbHXN4jn
当時の設計なら、gets の仕様はああなる。
2019/11/22(金) 14:46:28.12ID:vYD7HZZ7
gets()をゲッツ、puts()をプッツと読んでたな
2019/11/22(金) 14:53:55.43ID:eCK2aX+t
strtokの読み方で出身地が分かる
2019/11/22(金) 15:15:08.67ID:vYD7HZZ7
>>5
それはストアトークと読んでた
それはストアトークと読んでた
7デフォルトの名無しさん
2019/11/23(土) 04:11:30.09ID:l4WHmfnE 最大のミスは、文字列そのものをデータ型としては持たずに、
文字列はヌルで終端された不定長の文字の配列であるとしたことにある。
文字列はヌルで終端された不定長の文字の配列であるとしたことにある。
2019/11/23(土) 06:08:18.47ID:eMnkZzKn
どうすれば良かった?
2019/11/23(土) 06:14:02.33ID:GXkG1Oic
関数だっつうてんのに
2019/11/25(月) 21:55:20.72ID:E+NtJXA3
scanfだろjk
2019/11/26(火) 04:12:31.62ID:As19A6dg
putchar()はプッチャーと読んでいた
12デフォルトの名無しさん
2019/11/26(火) 12:29:09.20ID:dAEqoOXB scanf
strtok
feof
strtok
feof
2019/11/26(火) 20:24:02.10ID:feqSm/53
C言語の関数名ってまだリンカがシンボルの先頭から6文字までしか認識しなかった頃の名残だしな
変な短縮形が多い
変な短縮形が多い
2019/11/27(水) 03:05:40.28ID:nQw9n1Di
strcpy()とか意図しようがしまいが簡単にメモリをぶっ壊せる
よくよく考えるとキチガイ過ぎる
よくよく考えるとキチガイ過ぎる
2019/11/27(水) 12:17:59.87ID:zdI/1sLa
C言語に安全性を求めるのは違う
16デフォルトの名無しさん
2019/11/27(水) 12:31:41.61ID:KtqS+hCI time
localtime
localtime
2019/11/27(水) 13:15:40.24ID:MN5dlGGA
>>15
ほんそれ
ほんそれ
2019/11/27(水) 13:50:48.05ID:pAkxzJaX
2019/11/27(水) 14:42:57.39ID:MN5dlGGA
大昔に出来た関数なんだから多くを求めるな
2019/11/30(土) 20:36:22.78ID:4Da+M2q+
>>11
俺はプッキャーだった
俺はプッキャーだった
2019/11/30(土) 20:38:28.97ID:4Da+M2q+
2019/11/30(土) 21:25:24.92ID:vRr1Hx4s
安全は考えないで設計したのでミスってはいない
2019/11/30(土) 22:19:14.33ID:Zwer7NNs
アブドーラ・ザ・プッチャー
2019/12/01(日) 10:49:26.54ID:uAQAPMuh
組み込みでC言語は使うけど、10個以上の標準関数って使わないな...。
2019/12/01(日) 12:47:24.87ID:p3Z7Nr0h
memcpy / memset / memcmp
strlen / str(n)cpy / str(n)cmp / str(n)cat
これで10個
strlen / str(n)cpy / str(n)cmp / str(n)cat
これで10個
2019/12/01(日) 13:17:11.11ID:W5IIwakz
組み込みで文字列扱わないことも多いね。
どんな製品でもほぼ使うのはmemset、memcpy、memcmpぐらいじゃない?
どんな製品でもほぼ使うのはmemset、memcpy、memcmpぐらいじゃない?
2019/12/01(日) 17:41:11.15ID:YWi4MX0G
2019/12/01(日) 20:53:25.46ID:IKYJT3WJ
C言語ではなく標準ライブラリの話かい。
2019/12/01(日) 21:25:08.28ID:7gLQ63yc
アセンブラより安全なら良いじゃん
2019/12/02(月) 00:51:13.45ID:RIgVO6ZZ
memcpyが危険とか言うなら
C言語使うなってことになる
C言語使うなってことになる
2019/12/02(月) 00:53:00.40ID:RIgVO6ZZ
2019/12/02(月) 02:04:59.50ID:AAYR8Yqw
2019/12/02(月) 06:48:47.55ID:kJrDK+4B
2019/12/02(月) 13:15:48.70ID:EYnQFBh2
一体どういう考えで昔の人は、getsの仕様はあれでOKだと思ったんだろう?
どう考えてもバッファオーバーフローするやん?
しない方法なんて存在するの?
どう考えてもバッファオーバーフローするやん?
しない方法なんて存在するの?
2019/12/02(月) 13:18:13.53ID:xJykAg3Z
バッファオーバーフローしないデータを食わせれば良い
わざわざ変なデータを入力するヤツが悪い
って考えの時代の関数だ
わざわざ変なデータを入力するヤツが悪い
って考えの時代の関数だ
2019/12/02(月) 13:41:09.67ID:EYnQFBh2
でもさ、getsってキーボード入力やろ?
2019/12/02(月) 15:30:07.33ID:LC/c96JG
gets は、もう、標準ライブラリにも入っていないので許せ
2019/12/02(月) 18:02:20.65ID:kmSxls5X
>>36
わざわざ変なデータを入力するヤツが悪い
わざわざ変なデータを入力するヤツが悪い
2019/12/02(月) 18:41:59.62ID:E2hgf+6B
ダンディ坂野「gets!!」
2019/12/02(月) 20:50:15.44ID:kJrDK+4B
41デフォルトの名無しさん
2019/12/03(火) 01:51:02.34ID:dBsSbed7 8ビットの整数型を char などというものにしたのも、アメリカ人は
自分たちの英語しか知らない田舎者であることを如実に表している。
自分たちの英語しか知らない田舎者であることを如実に表している。
42デフォルトの名無しさん
2019/12/03(火) 09:14:31.49ID:yN5r9ueQ >>40
64kbでも広大な空間だったな
64kbでも広大な空間だったな
2019/12/03(火) 12:22:07.21ID:90Sp73uq
2019/12/03(火) 12:29:35.88ID:Uh1tIUQA
> 逆だよ、都会の人間は都会のことしか知らないし知る必要がない
だから世界が狭くて無知になりやすい
> なぜか田舎の人間は都会のことも知ろうとするw
だから世界が広い
だから世界が狭くて無知になりやすい
> なぜか田舎の人間は都会のことも知ろうとするw
だから世界が広い
45デフォルトの名無しさん
2019/12/03(火) 12:51:15.68ID:dBsSbed7 井の中の蛙 大海を知らず
されど空の蒼さを知る
されど空の蒼さを知る
2019/12/03(火) 13:25:13.55ID:g2sdmHcp
C言語が出来た時の時代を考えれば十分
「変数名に日本語が使えない言語は糞」
って時代もそのうち来るよ
「変数名に日本語が使えない言語は糞」
って時代もそのうち来るよ
2019/12/03(火) 19:14:24.81ID:90Sp73uq
>>44
残念ながらそうはなってないんだなw
狭く深くっていう世界だから
要するに田舎でな何をするにもオーバーヘッドが大きいってことな
今はネットでだいぶマシになったけどネット以前の情報収集考えたらアホでもわかる話
残念ながらそうはなってないんだなw
狭く深くっていう世界だから
要するに田舎でな何をするにもオーバーヘッドが大きいってことな
今はネットでだいぶマシになったけどネット以前の情報収集考えたらアホでもわかる話
2019/12/08(日) 02:33:17.34ID:aqWVKWA+
アホなデータ食わせるアホなやつのために堅牢な仕組みにする必要はない
2019/12/11(水) 01:29:51.60ID:7IDmuKiG
>>41
元々は9bit
元々は9bit
50デフォルトの名無しさん
2019/12/11(水) 06:55:08.36ID:IbA4V9X0 >>46
メモリが640kバイトしか使えなかった頃からのものだしな
メモリが640kバイトしか使えなかった頃からのものだしな
2019/12/11(水) 07:59:10.55ID:yA/FdCBI
>>5
ストラトック
ストラトック
2019/12/11(水) 15:20:43.27ID:JkExA39E
大昔って端末やエディタなんかでも1行256とか1024バイト程度しか扱えなかったばず
53デフォルトの名無しさん
2019/12/11(水) 15:32:22.68ID:8OP/pbId 256 の時代は割と長かった希ガス
2019/12/13(金) 06:37:32.10ID:o1f1J6fH
昔は1行の長さを先に決めてファイルをクリエイトしました
途中で変更はできません
途中で変更はできません
55デフォルトの名無しさん
2019/12/14(土) 13:26:55.02ID:TlZt0bii 関数そのものじゃないが
breakにラベル指定出来なかったのは設計ミスやろ
breakにラベル指定出来なかったのは設計ミスやろ
2019/12/14(土) 13:54:03.80ID:JwYnIOEa
その為のgoto
57デフォルトの名無しさん
2019/12/14(土) 22:43:29.04ID:8CJijD11 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;
}
}
付けないといけないし、ラベル名を別のループ用のものと書き間違えると
意図しない所へ飛んで行ってしまう。スパゲッティでバグの元。
ループにラベルを付ければ、スコープがそのループ内に限定され、そのループの
外にある別のループに同じラベル名を付けることができるから、書きやすく
読みやすい。例えば、こんな感じ。
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;
}
}
2019/12/14(土) 22:45:51.60ID:JwYnIOEa
単純に
breakする数を指定出来るだけで良い
breakする数を指定出来るだけで良い
2019/12/15(日) 06:50:28.91ID:6aWNd1w0
>>58
ネストの数を数えるとか最低だと思う
ネストの数を数えるとか最低だと思う
2019/12/15(日) 07:00:06.17ID:a0yEED8b
1000行のコードでbreak 7;とかされても、
どこに抜けるかわからんよな!
どこに抜けるかわからんよな!
2019/12/15(日) 09:51:38.77ID:5sPbacoo
ネストの数がわからないような巨大な構造は
それだけで最低だ
そんなんだと名前付きループにした所で
@outerなんて名前が使い回されて
同じ名前のループがネストされて
それこそ難読コードになる
それならユニークなラベルによるgotoの方が良い
>>57くらいのループなら
break 2;
は名前を考える手間が無くて楽だし
見にくくもない
それだけで最低だ
そんなんだと名前付きループにした所で
@outerなんて名前が使い回されて
同じ名前のループがネストされて
それこそ難読コードになる
それならユニークなラベルによるgotoの方が良い
>>57くらいのループなら
break 2;
は名前を考える手間が無くて楽だし
見にくくもない
2019/12/15(日) 09:57:28.64ID:5sPbacoo
とは書いたけど
どっちも有るならどっちも欲しい
どっちかだけげならbreak 2;の方が欲しい
って感じ
どっちも有るならどっちも欲しい
どっちかだけげならbreak 2;の方が欲しい
って感じ
2019/12/15(日) 10:52:04.89ID:6aWNd1w0
2019/12/15(日) 11:05:09.82ID:5sPbacoo
ループの先頭、ループの終わり、break部分
3箇所見ないとダメってだけでダメな仕様
3箇所見ないとダメってだけでダメな仕様
2019/12/15(日) 12:32:17.60ID:bDjAMWVj
2019/12/15(日) 12:36:08.74ID:5sPbacoo
大きければgoto
小さければbreak n
小さければbreak n
2019/12/15(日) 12:38:50.49ID:5sPbacoo
名前を付ける手間を許容するならgotoという解決法が既にある
68デフォルトの名無しさん
2019/12/15(日) 13:48:44.02ID:o9m7qUoD >>60
ネスト変わるような変更あるたびにbreakの引数勝手に書き換えてくれるエディタとかマクロが流行る
ネスト変わるような変更あるたびにbreakの引数勝手に書き換えてくれるエディタとかマクロが流行る
2019/12/15(日) 16:33:57.62ID:bDjAMWVj
2019/12/15(日) 16:52:03.21ID:u46gpj2V
歪んだ教育のせいで
gotoに拒絶反応を示す人が多いんだよな
2重ループを抜けるなら素直にgotoを使えって
gotoに拒絶反応を示す人が多いんだよな
2重ループを抜けるなら素直にgotoを使えって
2019/12/15(日) 16:53:29.68ID:pTp+dpJs
アセンブラの
jmp 1f
とかを C でやりたいという話なのか?
やってみりゃいいじゃん。プリプロセッサの出力を処理すればいい。
1 パスで出来ると思うよ。
ひょっとしてもう誰かがやってるかも。
jmp 1f
とかを C でやりたいという話なのか?
やってみりゃいいじゃん。プリプロセッサの出力を処理すればいい。
1 パスで出来ると思うよ。
ひょっとしてもう誰かがやってるかも。
2019/12/15(日) 18:05:59.04ID:5sPbacoo
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:;
for (j = 1; j <= 3; j++) {
printf("%d, %d\n", i, j);
if (i * j > 3) goto outer;
}
} outer:;
2019/12/15(日) 18:58:38.98ID:5sPbacoo
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:;
for (j = 1; j <= 3; j++) {
printf("%d, %d\n", i, j);
if (i * j > 3) goto outer;
}
}
printf("complete\n");
outer:;
2019/12/15(日) 19:01:19.97ID:5sPbacoo
わざわざ言語拡張しなくても
>>57以上の事が実現出来る
>>57以上の事が実現出来る
2019/12/16(月) 09:05:52.89ID:AI1GDY0I
ラベルのスコープを狭くしたいという話のようだから
マクロの中で使ってこそ真価を発揮するんじゃないかな。
フル仕様のパースが必要というわけではなく、かなり手抜きできそうではある。
あれば便利というのは否定しないが、C でそこまで必要かというと…
マクロの中で使ってこそ真価を発揮するんじゃないかな。
フル仕様のパースが必要というわけではなく、かなり手抜きできそうではある。
あれば便利というのは否定しないが、C でそこまで必要かというと…
76デフォルトの名無しさん
2019/12/16(月) 12:33:03.93ID:0jmxiGrg {
goto hoge;
hoge:;
}
{
goto hoge;
hoge:;
}
これで二重になってたら困るしある意味なってなくても困るな
goto hoge;
hoge:;
}
{
goto hoge;
hoge:;
}
これで二重になってたら困るしある意味なってなくても困るな
2019/12/16(月) 13:21:05.83ID:ZZ8St2Js
マクロで二重以上のループってのもなかなか考えづらいなあ
一応、ラベル名をパラメータとする手もある
使う側のコストを考えるとgotoの為にパラメータを増やさないよな
gotoを使わない主義者がよくやってるように
余分な変数を使って実装するんだろうね
一応、ラベル名をパラメータとする手もある
使う側のコストを考えるとgotoの為にパラメータを増やさないよな
gotoを使わない主義者がよくやってるように
余分な変数を使って実装するんだろうね
2019/12/16(月) 13:23:11.26ID:ZZ8St2Js
アセンブラだとマクロローカルラベルってのがあったりする
ラベルを頻繁に使うので
あと
@@/@b/@fのように、
直近のラベルを指定する仕組みもある
ラベルを頻繁に使うので
あと
@@/@b/@fのように、
直近のラベルを指定する仕組みもある
2019/12/16(月) 13:28:49.41ID:ZZ8St2Js
2019/12/16(月) 15:17:28.75ID:arH1mwfY
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");
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");
2019/12/16(月) 16:34:59.64ID:/0yHEQmX
outer より後に処理が続く場合は?
2019/12/16(月) 16:51:44.02ID:arH1mwfY
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");
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");
2019/12/16(月) 16:55:03.26ID:arH1mwfY
"短い処理"をいちいち関数にしなくて済むから、break 2とかはあってもいいが、
長い処理は関数にしてないとろくにテストできないんだからgotoなんていらない
長い処理は関数にしてないとろくにテストできないんだからgotoなんていらない
2019/12/16(月) 19:03:13.17ID:4DgO9d+i
じゃあ>>57もいらないね
2019/12/16(月) 19:09:09.12ID:lsrBHsJG
gotoの基本的な使い方くらい知っておいた方が良いかと
ループを抜ける為だけに関数を分けないといけなくなるし
挙げ句の果てに言語の欠陥とか言い出す
ループを抜ける為だけに関数を分けないといけなくなるし
挙げ句の果てに言語の欠陥とか言い出す
2019/12/16(月) 20:06:51.00ID:3ha1TSe5
今のC言語ではネストしたループから抜けるのはフラグを使うかgotoしかないからたいていgoto使ってるけどgotoなんて野蛮なものはできたら使いたくないから他の言語で実装されてるラベル付きbreakなりレベル付きbreakが欲しいって話だろ
今更gotoの基本的な使い方ガーとか言ってる奴はどんだけ低レベルなんだよw
今更gotoの基本的な使い方ガーとか言ってる奴はどんだけ低レベルなんだよw
2019/12/16(月) 20:09:28.82ID:xr9KOlE0
あれ?
returnで抜ける為に関数に分けるんじゃなかったの?
returnで抜ける為に関数に分けるんじゃなかったの?
レスを投稿する
