TOP カテ一覧 スレ一覧 100〜終まで 2ch元 削除依頼
プログラミングのお題スレ Part11
StackOverflowについて語るスレ
Excel VBA 質問スレ Part55
Borlandにはやられた...
Excel VBA 質問スレ Part62
ほぼ初心者プログラマでするべき事がわからない
Xamarin Part6
C#だとそんなに重くなるもんなの?
【Electron】ハイブリッドアプリ開発総合【Cordova】
今までみた絶望的なソースコード

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はどういうつもりで書いたんでしょうかね?

101 :
gogoサイコーっす

102 :
間違えたw goto

103 :
話を戻して

・ループを抜けた後に関数の後処理が必要な場合
・ループを抜けた後にローカル変数を使った処理をする場合
・他、意味的に関数内で処理したい場合

はどうするの?

104 :
> ・ループを抜けた後に関数の後処理が必要な場合
前処理を関数の中でするな

> ・ループを抜けた後に関数の後処理が必要な場合
戻り値を返せ

>・他、意味的に関数内で処理したい場合
自分で具体例が思いつかないなら出すな

105 :
コピペミスったな

>・ループを抜けた後にローカル変数を使った処理をする場合
戻り値を返せ

106 :
>>104
なぜ?

107 :
>>106
なにが?

ってか、もう少し具体例を書けよ。
それみれば設計がおかしいという結論になる

例えて言うなら、パーサーの処理の中でネットワークにアクセスしたい時困るから
ネットワークモジュールはグローバルにアクセスできるようにしておくべき
みたいなことを言ってるようなもんだよ。それは設計がおかしい。

108 :
int func(int n){
ロック
ループ
アンロック
return 結果;
}

109 :
int func(int n){
ループ
値を加工
return 値
}

110 :
>>108
「ループ」という言い方がおかしい。
ループで「実装」しているのであって
やっているのはなにかの「処理」だろう?


int func(int n){
ロック
処理
アンロック
return 結果;
}


「処理」という名前をつけたくなるならば、
そこは独立した関数にするべきだろう

111 :
double sigma(const double *a){
ループで総和と2乗和と数を計算
標準偏差を計算
return 標準偏差
}

112 :
int func(int n){
int a[10] = {0};
ループ
aから値を計算
return 値
}

113 :
いくらでも思い浮かぶ

114 :
全部関数に分けろって言われて終わりそう

115 :
分ける理由がない

116 :
>>112を分けてみて

117 :
関数分けってのは意味、機能、汎用性、...で分けるべきであって
単にループを抜けるのにreturnを使いたいから分けるとかを考えるべきじゃない

118 :
素直にgotoの使い方を覚えた方が良いよ
意地はってないで

119 :
>>118
だから意味とか汎用性とかで分けると
自然にループに抜けるときにreturnを使えば良くなるんだよ

120 :
gotoでもreturnでも読めれば良い
但し1関数50行以上は読めないんで宜しく

121 :
>>112
だから「ループ」と書くなっちゅうねんw
関数を設計するならこんな感じやろ?

int func(int n){
int a[10] = {0};
memset_random(a, sizeof(a)); // a配列をランダムな値で埋める
int chksum = chksum(a, sizeof(a)); // a配列のチェックサムを計算
return 値
}

関数の中でループしてようが何して用が関係ないわ

122 :
sizeof(a) とか書くレベルの相手してたのか
アホらしい

123 :
>>119
じゃあ普通のbreakもいらないね
まさか使ってないよね

124 :
まあgotoあればbreakは要らんわなw
そんな言語は使いたくないけど

125 :
gotoもbreakもいらないって

126 :
gotoもbreakも無い
ループを抜けるときはreturn
switchを抜ける時もreturm
関数は単一の処理しか出来ない

こんな言語はイヤだね

127 :
後に退けなくなったアホの作る言語

128 :
gotoの使い方

http://www7b.biglobe.ne.jp/~robe/cpphtml/html03/cpp03005.html
http://www9.plala.or.jp/sgwr-t/c/sec06-6.html
http://tomeapp.jp/archives/1029
http://opencv.jp/opencv-2svn/c/core_utility_and_system_functions_and_macros.html

129 :
たとえ相手がアホであっても、しつこく絡むのもまたアホだと思うんだが…

130 :
自分より下の人間を叩くしか能がないんだろ
ID:arH1mwfYなんてスルーでいいと思うんだがそれしか叩けないからいつまでたっても終わらないw

131 :
雑談スレだしネタも無いから良いんじゃね?

132 :
String型が無いって死ぬほど不便なんだが

133 :
他の言語を使ってください

134 :
>>132
自分で似たようなものを作ればいいだろ。汎用的なものがあっても使い勝手や性能で何かしら不満が出るのだから、自分の要求に合致するものを自分で作りな。

135 :
特定の用途においてローカルラベルが役に立つことも無くはないかもしれないな。
自分でそれをやるかどうかは別にして。
いずれにせよ、gcc では式の中で変数を宣言できるのだから
ローカルラベルが可能になっても驚かないよ。

136 :
typedefを使用
https://pastebin.com/iX2DDpRA

137 :
PHPはbreakにネスト数指定できるよな

138 :
C言語の開発者によるgoto文の使い方を対象とした実証研究の結果、「goto文は無害だと考えられる」
https://developers.srad.jp/story/15/02/14/2017207/

139 :
longjmp についても調査してほしいな。
特に例は挙げないが、誰もが使っているようなプログラムでも結構使われてる。

140 :
static

141 :2019/12/25
>>139
それは代わりがない。

プログラム始めたいけどrubyかPythonどっちが良い
Google App Engine for java
【日本語不自由】Eclipse Pleiades プラグイン
【O3D】HTML5用 3D API WebGL 【Canvas:3D】
NullPointerExceptionを「ぬるぽ」と呼ぶスレ6
人工知能を作ろうver0.0.7
Visual Studio 2008 Part 22
関数型プログラミング言語Haskell Part32
Swift part12
Pythonについて(アンチ専用)
--------------------
埼玉川越ドン・キホーテ(1F)
【ろ】変態キーボード1枚目【Fn】
スレ立てるほどでもない大会・海外卓球「女子12」
SONY Xperia Z Ultra part46
秋篠宮佳子内親王親衛隊 第27師団
ガンプラ系YouTuberを語るスレ 6 (IP・ワッチョイ無し
「こいつ確実に男いるだろ」ってメンバー
【スレも成績も】河内洋厩舎・第6章【落とすな】
板野友美 ★382
ニュル市販車最速!アポロスポーツ!
千葉・ZOZOマリンの売り子ちゃん 62杯
【バーチャルYoutuber】にじさんじウンチスレ18620【揉ませろ】
スプラトゥーン動画投稿者スレ★253
【北の】北海学園大学二部その55【早稲田】
【犯罪集団と】公益社団法人整体協会【変わりない】
【DDON】メイン鹿くんヲチスレ
今週の日ペ美子ちゃん、久々にどちゃシコ [579392623]
仏足石歌スレ
【901/911/930】空冷ポルシェで走れ♪63【964/995】
シンフォギュアでありえないハマりみた
TOP カテ一覧 スレ一覧 100〜終まで 2ch元 削除依頼