C言語の設計ミスった危険な関数トップ10決めようぜ

2019/11/21(木) 12:23:44.93ID:T7Jjyyy1
gets関数とか

その他の例
https://www.jpcert.or.jp/sc-rules/c-msc24-c.html
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
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
2019/11/27(水) 13:15:40.24ID:MN5dlGGA
>>15
ほんそれ
2019/11/27(水) 13:50:48.05ID:pAkxzJaX
>>15
根本的な所を勘違いしてる。

C言語で安全性が求められないからと言って、
C言語で作ったアプリには安全性は求められるだろ?

例えば、getsは安全に使うことが不可能なんだよ。
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+
>>18
> 例えば、getsは安全に使うことが不可能なんだよ。
ならgetsを使わずにgetcでやればいいだけ
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個
2019/12/01(日) 13:17:11.11ID:W5IIwakz
組み込みで文字列扱わないことも多いね。
どんな製品でもほぼ使うのはmemset、memcpy、memcmpぐらいじゃない?
2019/12/01(日) 17:41:11.15ID:YWi4MX0G
>>25

>>1のリンク先より

未チェックの時代遅れの関数
以下の関数を、未チェックの時代遅れの関数と定義する。
memcpy, strcpy, strncpy, strcat, strncat (一部抜粋)


半分あてはまってるなw

>>26
memcpyは危険なので使うのはやめましょう
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言語使うなってことになる
2019/12/02(月) 00:53:00.40ID:RIgVO6ZZ
>>28
標準じゃない関数だと...
失敗談みたいなのを期待してた?
2019/12/02(月) 02:04:59.50ID:AAYR8Yqw
>>1
セキュリティ考慮していない元関数より、代替関数の設計ミスが酷いな

strtodとかなにこれw
エラーの返し方がアホすぎる
2019/12/02(月) 06:48:47.55ID:kJrDK+4B
>>32
> strtodとかなにこれw
> エラーの返し方がアホすぎる
そう言うのは改善案を提案しないと単なるアホの独り言にしかならんぞw
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
>>36
1行80文字とかって決め打ちできる環境なんでしょ
自分しか使わないようなツールとかならこれで十分
って考え
41デフォルトの名無しさん
垢版 |
2019/12/03(火) 01:51:02.34ID:dBsSbed7
8ビットの整数型を char などというものにしたのも、アメリカ人は
自分たちの英語しか知らない田舎者であることを如実に表している。
42デフォルトの名無しさん
垢版 |
2019/12/03(火) 09:14:31.49ID:yN5r9ueQ
>>40
64kbでも広大な空間だったな
2019/12/03(火) 12:22:07.21ID:90Sp73uq
>>41
実に田舎者の考え方で笑える
逆だよ、都会の人間は都会のことしか知らないし知る必要がない
なぜか田舎の人間は都会のことも知ろうとするw
2019/12/03(火) 12:29:35.88ID:Uh1tIUQA
> 逆だよ、都会の人間は都会のことしか知らないし知る必要がない
だから世界が狭くて無知になりやすい

> なぜか田舎の人間は都会のことも知ろうとする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
狭く深くっていう世界だから
要するに田舎でな何をするにもオーバーヘッドが大きいってことな
今はネットでだいぶマシになったけどネット以前の情報収集考えたらアホでもわかる話
2019/12/08(日) 02:33:17.34ID:aqWVKWA+
アホなデータ食わせるアホなやつのために堅牢な仕組みにする必要はない
2019/12/11(水) 01:29:51.60ID:7IDmuKiG
>>41
元々は9bit
50デフォルトの名無しさん
垢版 |
2019/12/11(水) 06:55:08.36ID:IbA4V9X0
>>46
メモリが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にラベル指定出来なかったのは設計ミスやろ
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;
  }
}
2019/12/14(土) 22:45:51.60ID:JwYnIOEa
単純に
breakする数を指定出来るだけで良い
レスを投稿する

5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況