TOP カテ一覧 スレ一覧 100〜終まで 2ch元 削除依頼
ふらっと C#,C♯,C#(初心者用) Part144
Boost C++ Libraries Sandbox
静的型付け言語の潜在開発生産性は今の100倍 ×5
オブジェクト指向の活用方法を教えて下さい
PowerShell -Part 4
C++でXML(主にxerces)やろう!
c、Java、pythonを難易度でランク付けして
リーダブルコーディング技術スレ
スレを勃てるまでもないC/C++の質問はここで 25 [隔離病棟]
MFC相談室 mfc23d.dll
C言語の設計ミスった危険な関数トップ10決めようぜ
- 1 :2019/11/21 〜 最終レス :2019/12/25
- gets関数とか
その他の例
https://www.jpcert.or.jp/sc-rules/c-msc24-c.html
- 2 :
- Anal
- 3 :
- 当時の設計なら、gets の仕様はああなる。
- 4 :
- gets()をゲッツ、puts()をプッツと読んでたな
- 5 :
- strtokの読み方で出身地が分かる
- 6 :
- >>5
それはストアトークと読んでた
- 7 :
- 最大のミスは、文字列そのものをデータ型としては持たずに、
文字列はヌルで終端された不定長の文字の配列であるとしたことにある。
- 8 :
- どうすれば良かった?
- 9 :
- 関数だっつうてんのに
- 10 :
- scanfだろjk
- 11 :
- putchar()はプッチャーと読んでいた
- 12 :
- scanf
strtok
feof
- 13 :
- C言語の関数名ってまだリンカがシンボルの先頭から6文字までしか認識しなかった頃の名残だしな
変な短縮形が多い
- 14 :
- strcpy()とか意図しようがしまいが簡単にメモリをぶっ壊せる
よくよく考えるとキチガイ過ぎる
- 15 :
- C言語に安全性を求めるのは違う
- 16 :
- time
localtime
- 17 :
- >>15
ほんそれ
- 18 :
- >>15
根本的な所を勘違いしてる。
C言語で安全性が求められないからと言って、
C言語で作ったアプリには安全性は求められるだろ?
例えば、getsは安全に使うことが不可能なんだよ。
- 19 :
- 大昔に出来た関数なんだから多くを求めるな
- 20 :
- >>11
俺はプッキャーだった
- 21 :
- >>18
> 例えば、getsは安全に使うことが不可能なんだよ。
ならgetsを使わずにgetcでやればいいだけ
- 22 :
- 安全は考えないで設計したのでミスってはいない
- 23 :
- アブドーラ・ザ・プッチャー
- 24 :
- 組み込みでC言語は使うけど、10個以上の標準関数って使わないな...。
- 25 :
- memcpy / memset / memcmp
strlen / str(n)cpy / str(n)cmp / str(n)cat
これで10個
- 26 :
- 組み込みで文字列扱わないことも多いね。
どんな製品でもほぼ使うのはmemset、memcpy、memcmpぐらいじゃない?
- 27 :
- >>25
>>1のリンク先より
未チェックの時代遅れの関数
以下の関数を、未チェックの時代遅れの関数と定義する。
memcpy, strcpy, strncpy, strcat, strncat (一部抜粋)
半分あてはまってるなw
>>26
memcpyは危険なので使うのはやめましょう
- 28 :
- C言語ではなく標準ライブラリの話かい。
- 29 :
- アセンブラより安全なら良いじゃん
- 30 :
- memcpyが危険とか言うなら
C言語使うなってことになる
- 31 :
- >>28
標準じゃない関数だと...
失敗談みたいなのを期待してた?
- 32 :
- >>1
セキュリティ考慮していない元関数より、代替関数の設計ミスが酷いな
strtodとかなにこれw
エラーの返し方がアホすぎる
- 33 :
- >>32
> strtodとかなにこれw
> エラーの返し方がアホすぎる
そう言うのは改善案を提案しないと単なるアホの独り言にしかならんぞw
- 34 :
- 一体どういう考えで昔の人は、getsの仕様はあれでOKだと思ったんだろう?
どう考えてもバッファオーバーフローするやん?
しない方法なんて存在するの?
- 35 :
- バッファオーバーフローしないデータを食わせれば良い
わざわざ変なデータを入力するヤツが悪い
って考えの時代の関数だ
- 36 :
- でもさ、getsってキーボード入力やろ?
- 37 :
- gets は、もう、標準ライブラリにも入っていないので許せ
- 38 :
- >>36
わざわざ変なデータを入力するヤツが悪い
- 39 :
- ダンディ坂野「gets!!」
- 40 :
- >>36
1行80文字とかって決め打ちできる環境なんでしょ
自分しか使わないようなツールとかならこれで十分
って考え
- 41 :
- 8ビットの整数型を char などというものにしたのも、アメリカ人は
自分たちの英語しか知らない田舎者であることを如実に表している。
- 42 :
- >>40
64kbでも広大な空間だったな
- 43 :
- >>41
実に田舎者の考え方で笑える
逆だよ、都会の人間は都会のことしか知らないし知る必要がない
なぜか田舎の人間は都会のことも知ろうとするw
- 44 :
- > 逆だよ、都会の人間は都会のことしか知らないし知る必要がない
だから世界が狭くて無知になりやすい
> なぜか田舎の人間は都会のことも知ろうとするw
だから世界が広い
- 45 :
- 井の中の蛙 大海を知らず
されど空の蒼さを知る
- 46 :
- C言語が出来た時の時代を考えれば十分
「変数名に日本語が使えない言語は糞」
って時代もそのうち来るよ
- 47 :
- >>44
残念ながらそうはなってないんだなw
狭く深くっていう世界だから
要するに田舎でな何をするにもオーバーヘッドが大きいってことな
今はネットでだいぶマシになったけどネット以前の情報収集考えたらアホでもわかる話
- 48 :
- アホなデータ食わせるアホなやつのために堅牢な仕組みにする必要はない
- 49 :
- >>41
元々は9bit
- 50 :
- >>46
メモリが640kバイトしか使えなかった頃からのものだしな
- 51 :
- >>5
ストラトック
- 52 :
- 大昔って端末やエディタなんかでも1行256とか1024バイト程度しか扱えなかったばず
- 53 :
- 256 の時代は割と長かった希ガス
- 54 :
- 昔は1行の長さを先に決めてファイルをクリエイトしました
途中で変更はできません
- 55 :
- 関数そのものじゃないが
breakにラベル指定出来なかったのは設計ミスやろ
- 56 :
- その為のgoto
- 57 :
- 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 :
- 単純に
breakする数を指定出来るだけで良い
- 59 :
- >>58
ネストの数を数えるとか最低だと思う
- 60 :
- 1000行のコードでbreak 7;とかされても、
どこに抜けるかわからんよな!
- 61 :
- ネストの数がわからないような巨大な構造は
それだけで最低だ
そんなんだと名前付きループにした所で
@outerなんて名前が使い回されて
同じ名前のループがネストされて
それこそ難読コードになる
それならユニークなラベルによるgotoの方が良い
>>57くらいのループなら
break 2;
は名前を考える手間が無くて楽だし
見にくくもない
- 62 :
- とは書いたけど
どっちも有るならどっちも欲しい
どっちかだけげならbreak 2;の方が欲しい
って感じ
- 63 :
- >>61
> そんなんだと名前付きループにした所で
> @outerなんて名前が使い回されて
> 同じ名前のループがネストされて
> それこそ難読コードになる
無能の妄想w
- 64 :
- ループの先頭、ループの終わり、break部分
3箇所見ないとダメってだけでダメな仕様
- 65 :
- >>64
なぜか自分の前提は
> >>57くらいのループなら
なのにラベルにした途端にループの頭とbreakとループの終わりが一瞥でわからないとかアホすぎ
- 66 :
- 大きければgoto
小さければbreak n
- 67 :
- 名前を付ける手間を許容するならgotoという解決法が既にある
- 68 :
- >>60
ネスト変わるような変更あるたびにbreakの引数勝手に書き換えてくれるエディタとかマクロが流行る
- 69 :
- >>67
ifとgotoあるからforもwhileもdoも要らんという主張か
本物のプログラマーだなw
- 70 :
- 歪んだ教育のせいで
gotoに拒絶反応を示す人が多いんだよな
2重ループを抜けるなら素直にgotoを使えって
- 71 :
- アセンブラの
jmp 1f
とかを C でやりたいという話なのか?
やってみりゃいいじゃん。プリプロセッサの出力を処理すればいい。
1 パスで出来ると思うよ。
ひょっとしてもう誰かがやってるかも。
- 72 :
- 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 :
- 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 :
- わざわざ言語拡張しなくても
>>57以上の事が実現出来る
- 75 :
- ラベルのスコープを狭くしたいという話のようだから
マクロの中で使ってこそ真価を発揮するんじゃないかな。
フル仕様のパースが必要というわけではなく、かなり手抜きできそうではある。
あれば便利というのは否定しないが、C でそこまで必要かというと…
- 76 :
- {
goto hoge;
hoge:;
}
{
goto hoge;
hoge:;
}
これで二重になってたら困るしある意味なってなくても困るな
- 77 :
- マクロで二重以上のループってのもなかなか考えづらいなあ
一応、ラベル名をパラメータとする手もある
使う側のコストを考えるとgotoの為にパラメータを増やさないよな
gotoを使わない主義者がよくやってるように
余分な変数を使って実装するんだろうね
- 78 :
- アセンブラだとマクロローカルラベルってのがあったりする
ラベルを頻繁に使うので
あと
@@/@b/@fのように、
直近のラベルを指定する仕組みもある
- 79 :
- >>72 >>73 みたいなのって
gotoの使いどころだと思うんだけだ
gotoを使わない人はどう書いてるの?
特に >>57 の答えを聞いてみたい
- 80 :
- 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 :
- outer より後に処理が続く場合は?
- 82 :
- 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 :
- "短い処理"をいちいち関数にしなくて済むから、break 2とかはあってもいいが、
長い処理は関数にしてないとろくにテストできないんだからgotoなんていらない
- 84 :
- じゃあ>>57もいらないね
- 85 :
- gotoの基本的な使い方くらい知っておいた方が良いかと
ループを抜ける為だけに関数を分けないといけなくなるし
挙げ句の果てに言語の欠陥とか言い出す
- 86 :
- 今のC言語ではネストしたループから抜けるのはフラグを使うかgotoしかないからたいていgoto使ってるけどgotoなんて野蛮なものはできたら使いたくないから他の言語で実装されてるラベル付きbreakなりレベル付きbreakが欲しいって話だろ
今更gotoの基本的な使い方ガーとか言ってる奴はどんだけ低レベルなんだよw
- 87 :
- あれ?
returnで抜ける為に関数に分けるんじゃなかったの?
- 88 :
- gotoは野蛮とかいう歪んだ教育のせいで
わざわざ変数を定義したりわざわざ関数を分けたりして
わざわざ見にくいコードにしちゃう
生でポインタを扱う野蛮なC言語なんか使わないで
上品な言語を使った方が良いよ
- 89 :
- gotoじゃなくてgodowntoなら誰も文句言わなかった
- 90 :
- 自分は小規模な字句解析みたいなのでもgoto使うことがある。
ラベルで状態を表してgotoで遷移する。
goto使わなかったら状態を変数に入れて、
ループの中でswitchで場合分けするようなコードになって辛い。
- 91 :
- ループの中のswitchでループを抜けるのに
gotoを使うんじゃ?
- 92 :
- 次の状態を返す関数ポインタでループすればいんじゃないの?
- 93 :
- そんな野蛮なことはしません
- 94 :
- >>87
returnで抜けるためというか、
1. gotoで抜けたい
2. 関数にするか
3. あ、そもそもコードが複雑なんだな
4. 関数にして正解だった
こんな感じかな。
gotoで抜けたいと思う=コードが複雑になってるという警鐘だと思ってる。
- 95 :
- で>>82みたいな意味不明な関数の分け方をすると
>>57は、より複雑な記述をしたいっていう主張だし
gotoに親を殺された人の言うことは支離滅裂
理由が後付けだからそうなる
- 96 :
- > で>>82みたいな意味不明な関数の分け方をすると
なんで意味不明?
そもそもその処理に意味をもたせてから言おうよw
処理に意味をもたせると、関数にしたほうが良いと思うからさ
- 97 :
- > 理由が後付けだからそうなる
質問の方が先なのに、理由を先に言えるわけがないw
Q. 多重ループから抜けるのに、gotoは必要ですか?
A. 必要ありません。多重ループが必要になるぐらい複雑なら関数にしますから
これが普通だから、後付にはならないよね。
- 98 :
- じゃ>>57も当然不要ですね
- 99 :
- そんなにくり返し言わなくても、最初から不要だしw
- 100 :
- じゃあ>>57はどういうつもりで書いたんでしょうかね?
100〜のスレッドの続きを読む
Rust Part7
スレ立てるまでもない質問はここで 152匹目
わんくま死亡か?
GCCについて part10
.netグレープシティコンポーネント
ねねっちと一緒にプログラムを勉強するスレ第3話
Kotlin 5
【初心者歓迎】C/C++室 Ver.103【環境依存OK】
Visual Studio 2013 SP8
くだすれDelphi(超初心者用)その57
--------------------
Samsung Galaxy S8/S8+ 総合スレ Part76
★【緊張してた】ArcheageL鯖晒し30【べくとる】
YAM※AHAっ子参観日 5日目
北斗の拳 転生の章 Part152
このスレはご自由にお使いください249
【初音ミク】みっぱいぺろぺろスレ146【DIVA】
【FEH】ファイアーエムブレム ヒーローズのんびりスレ part350
【MHFZ】愚痴・無職・嫉妬・晒しスレ109
【最新世論調査】日本が譲歩するぐらいなら関係改善を急ぐ必要はない69% − 日本経済新聞
●を使って書き込めたらここへ集まれ
ネ実ミリシタスレ あずさsanのLarge Size
【八月のシンデレラナイン】鈴木和香はお兄ちゃん大好きかわいい
欧州など世界でガソリン車販売禁止、完全に電気自動車へ11【電気に嫉妬するデンキチ完全敗北w】
TSS(TISシステムサービス)7日目
2020年メンズ福袋スレッドPart1
「牛」「豚」「鶏」こいつら可哀想過ぎじゃね?魚と違って普通に知能や痛覚あるじゃん [557893653]
[NETGEAR] ReadyNAS総合 Part42 [X-RAID/RAIDiator]
高槻市を訪問した安倍総理の何気ない一コマに反響 『悪いが民主党のどの首相と比較しても 天地の差』「菅直人は、ひどかった」
アサルトライフルスレッド その64
女装した男がいる事案が発生 [621794405]
TOP カテ一覧 スレ一覧 100〜終まで 2ch元 削除依頼