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

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

その他の例
外部リンク[html]:www.jpcert.or.jp
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を使うんじゃ?
92: 2019/12/16(月)21:41 ID:wRV+mRkt(1) AAS
次の状態を返す関数ポインタでループすればいんじゃないの?
93: 2019/12/16(月)21:45 ID:jhycq5nX(1) AAS
そんな野蛮なことはしません
94: 2019/12/16(月)22:12 ID:arH1mwfY(4/13) AAS
>>87
returnで抜けるためというか、

1. gotoで抜けたい
2. 関数にするか
3. あ、そもそもコードが複雑なんだな
4. 関数にして正解だった

こんな感じかな。

gotoで抜けたいと思う=コードが複雑になってるという警鐘だと思ってる。
95: 2019/12/16(月)22:22 ID:xr9KOlE0(3/17) AAS
>>82みたいな意味不明な関数の分け方をすると
>>57は、より複雑な記述をしたいっていう主張だし

gotoに親を殺された人の言うことは支離滅裂
理由が後付けだからそうなる
96: 2019/12/16(月)22:27 ID:arH1mwfY(5/13) AAS
> で>>82みたいな意味不明な関数の分け方をすると

なんで意味不明?
そもそもその処理に意味をもたせてから言おうよw
処理に意味をもたせると、関数にしたほうが良いと思うからさ
97: 2019/12/16(月)22:32 ID:arH1mwfY(6/13) AAS
> 理由が後付けだからそうなる

質問の方が先なのに、理由を先に言えるわけがないw

Q. 多重ループから抜けるのに、gotoは必要ですか?
A. 必要ありません。多重ループが必要になるぐらい複雑なら関数にしますから

これが普通だから、後付にはならないよね。
98: 2019/12/16(月)22:37 ID:xr9KOlE0(4/17) AAS
じゃ>>57も当然不要ですね
99: 2019/12/16(月)22:38 ID:arH1mwfY(7/13) AAS
そんなにくり返し言わなくても、最初から不要だしw
100: 2019/12/16(月)22:39 ID:xr9KOlE0(5/17) AAS
じゃあ>>57はどういうつもりで書いたんでしょうかね?
101: 2019/12/16(月)22:40 ID:LjjtFzBx(2/4) AAS
gogoサイコーっす
102: 2019/12/16(月)22:41 ID:LjjtFzBx(3/4) AAS
間違えたw goto
103: 2019/12/16(月)22:42 ID:xr9KOlE0(6/17) AAS
話を戻して

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

はどうするの?
104
(1): 2019/12/16(月)22:44 ID:arH1mwfY(8/13) AAS
> ・ループを抜けた後に関数の後処理が必要な場合
前処理を関数の中でするな

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

>・他、意味的に関数内で処理したい場合
自分で具体例が思いつかないなら出すな
105: 2019/12/16(月)22:45 ID:arH1mwfY(9/13) AAS
コピペミスったな

>・ループを抜けた後にローカル変数を使った処理をする場合
戻り値を返せ
106
(1): 2019/12/16(月)22:48 ID:xr9KOlE0(7/17) AAS
>>104
なぜ?
107: 2019/12/16(月)22:52 ID:arH1mwfY(10/13) AAS
>>106
なにが?

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

例えて言うなら、パーサーの処理の中でネットワークにアクセスしたい時困るから
ネットワークモジュールはグローバルにアクセスできるようにしておくべき
みたいなことを言ってるようなもんだよ。それは設計がおかしい。
108
(1): 2019/12/16(月)22:54 ID:xr9KOlE0(8/17) AAS
int func(int n){
ロック
ループ
アンロック
return 結果;
}
109: 2019/12/16(月)22:55 ID:xr9KOlE0(9/17) AAS
int func(int n){
ループ
値を加工
return 値
}
110: 2019/12/16(月)22:58 ID:arH1mwfY(11/13) AAS
>>108
「ループ」という言い方がおかしい。
ループで「実装」しているのであって
やっているのはなにかの「処理」だろう?

int func(int n){
ロック
処理
アンロック
return 結果;
}
省2
111: 2019/12/16(月)23:02 ID:xr9KOlE0(10/17) AAS
double sigma(const double *a){
ループで総和と2乗和と数を計算
標準偏差を計算
return 標準偏差
}
112
(2): 2019/12/16(月)23:04 ID:xr9KOlE0(11/17) AAS
int func(int n){
int a[10] = {0};
ループ
aから値を計算
return 値
}
113: 2019/12/16(月)23:06 ID:xr9KOlE0(12/17) AAS
いくらでも思い浮かぶ
114: 2019/12/16(月)23:07 ID:LjjtFzBx(4/4) AAS
全部関数に分けろって言われて終わりそう
115: 2019/12/16(月)23:09 ID:xr9KOlE0(13/17) AAS
分ける理由がない
116: 2019/12/16(月)23:10 ID:xr9KOlE0(14/17) AAS
>>112を分けてみて
117: 2019/12/16(月)23:17 ID:xr9KOlE0(15/17) AAS
関数分けってのは意味、機能、汎用性、...で分けるべきであって
単にループを抜けるのにreturnを使いたいから分けるとかを考えるべきじゃない
118
(1): 2019/12/16(月)23:23 ID:xr9KOlE0(16/17) AAS
素直にgotoの使い方を覚えた方が良いよ
意地はってないで
119
(1): 2019/12/16(月)23:42 ID:arH1mwfY(12/13) AAS
>>118
だから意味とか汎用性とかで分けると
自然にループに抜けるときにreturnを使えば良くなるんだよ
120: 2019/12/16(月)23:45 ID:jL52ryYk(2/2) AAS
gotoでもreturnでも読めれば良い
但し1関数50行以上は読めないんで宜しく
121: 2019/12/16(月)23:48 ID:arH1mwfY(13/13) AAS
>>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: 2019/12/16(月)23:55 ID:xr9KOlE0(17/17) AAS
sizeof(a) とか書くレベルの相手してたのか
アホらしい
123: 2019/12/17(火)00:04 ID:JvBVW/sd(1/4) AAS
>>119
じゃあ普通のbreakもいらないね
まさか使ってないよね
124: 2019/12/17(火)06:41 ID:YMIUnRyv(1) AAS
まあgotoあればbreakは要らんわなw
そんな言語は使いたくないけど
125: 2019/12/17(火)07:00 ID:JvBVW/sd(2/4) AAS
gotoもbreakもいらないって
126: 2019/12/17(火)07:10 ID:JvBVW/sd(3/4) AAS
gotoもbreakも無い
ループを抜けるときはreturn
switchを抜ける時もreturm
関数は単一の処理しか出来ない

こんな言語はイヤだね
127: 2019/12/17(火)07:23 ID:JvBVW/sd(4/4) AAS
後に退けなくなったアホの作る言語
128: 2019/12/17(火)07:39 ID:odSFZTU+(1) AAS
gotoの使い方

外部リンク[html]:www7b.biglobe.ne.jp
外部リンク[html]:www9.plala.or.jp
外部リンク:tomeapp.jp
外部リンク[html]:opencv.jp
129: 2019/12/17(火)08:49 ID:QeraReD1(1/2) AAS
たとえ相手がアホであっても、しつこく絡むのもまたアホだと思うんだが…
130: 2019/12/17(火)12:33 ID:vDeQfs2U(1) AAS
自分より下の人間を叩くしか能がないんだろ
ID:arH1mwfYなんてスルーでいいと思うんだがそれしか叩けないからいつまでたっても終わらないw
131: 2019/12/17(火)13:15 ID:GBggCGQK(1) AAS
雑談スレだしネタも無いから良いんじゃね?
132
(2): 2019/12/17(火)18:32 ID:x9hYOthl(1) AAS
String型が無いって死ぬほど不便なんだが
133: 2019/12/17(火)19:06 ID:p6v4J1KY(1) AAS
他の言語を使ってください
134: 2019/12/17(火)19:18 ID:6LhBKKEf(1) AAS
>>132
自分で似たようなものを作ればいいだろ。汎用的なものがあっても使い勝手や性能で何かしら不満が出るのだから、自分の要求に合致するものを自分で作りな。
135: 2019/12/17(火)20:52 ID:QeraReD1(2/2) AAS
特定の用途においてローカルラベルが役に立つことも無くはないかもしれないな。
自分でそれをやるかどうかは別にして。
いずれにせよ、gcc では式の中で変数を宣言できるのだから
ローカルラベルが可能になっても驚かないよ。
136: 132 2019/12/18(水)23:56 ID:9RDvo6To(1) AAS
typedefを使用
外部リンク:pastebin.com
137: 2019/12/19(木)00:12 ID:vqVcyk4J(1) AAS
PHPはbreakにネスト数指定できるよな
138
(1): 2019/12/19(木)09:03 ID:vjQjJ4nK(1) AAS
C言語の開発者によるgoto文の使い方を対象とした実証研究の結果、「goto文は無害だと考えられる」
外部リンク:developers.srad.jp
139
(1): 2019/12/19(木)16:51 ID:86m15ms9(1) AAS
longjmp についても調査してほしいな。
特に例は挙げないが、誰もが使っているようなプログラムでも結構使われてる。
140: 2019/12/19(木)16:57 ID:+cpLTGtZ(1) AAS
static
141: 2019/12/25(水)01:15 ID:k3ZI/Zl3(1) AAS
>>139
それは代わりがない。
142: 2020/07/09(木)10:18 ID:tNMImStE(1) AAS
>>7
大発明なんbだけどな、
リスクも大きい
143
(1): 2020/07/09(木)10:22 ID:vrNDocOm(1) AAS
発明って言うか当時はそれが普通だったろ
144: 2020/07/09(木)10:51 ID:I92CxMlL(1) AAS
longjmpは「設計上のミス」ではないんでは。
むしろそういう動作をする目的で設計・導入されたように思えるけど
(longjmpに関するRationaleを読んでないので当てずっぽうw)
145: 2020/07/09(木)16:31 ID:KHuqFwsC(1) AAS
>>5
エスティーアールトゥーケー
146
(2): 2020/07/09(木)21:58 ID:Zo8nB2NL(1) AAS
例外は setjump、longjumpて実装されてるんじゃないのかな?
違うのかな?
147
(1): 2020/07/10(金)22:03 ID:AfLodKTd(1) AAS
>>143
普通じゃない
当時はPascalの文字数+文字列が普通
148
(1): 2020/07/10(金)22:26 ID:U1HXCT7S(1) AAS
returnが1変数しか対応していないこと。

ポインター祭りになって可読性がウンコになる
149: 2020/07/10(金)23:11 ID:7RoGj1wV(1) AAS
>>148
可読性がうんこなのはお前の能力が足りないから
150: 2020/07/11(土)00:22 ID:UdJEarb2(1) AAS
いろんな言語たらい回しにされるって不幸だよね。

こういうノーガキ垂れる奴がウチの職場にいなくて良かった〜ヽ(´▽`)/
151
(1): 2020/07/11(土)10:50 ID:J0INoyBc(1) AAS
>>147
OSのAPIは文字数じゃなくて
文字列byte列+デリミタ'$'
みたいなのが多かったぞ
152: 2020/07/11(土)12:01 ID:2M7rjl8q(1) AAS
>>151
それはCP/Mの文字列出力がそうなっていただけ
入力はC言語のfgets()なんかみたいにデリミタの '$' を付加したりしないよ
153
(1): 2020/07/11(土)23:02 ID:wT5X8b6q(1/2) AAS
MASM もそうだけど、$ は実際にメモリに配置されるのですか?
それとも、db(アセンブラ命令)で長さを省略するためのものですか?
154: 2020/07/11(土)23:04 ID:wT5X8b6q(2/2) AAS
すみません、>>153 です
送信した瞬間に自分の発言の矛盾に気がつきました…
155
(1): 2020/07/13(月)19:12 ID:Xa4f7njE(1) AAS
>>146
longjumbと例外に関して
すばらしい文書があるからお読みなさって。
外部リンク[htm]:www.nurs.or.jp
156
(1): 2020/07/13(月)19:20 ID:WBkWHxcT(1) AAS
そっちは Not Found ですよ
外部リンク[htm]:www.nurs.or.jp
157: ◆QZaw55cn4c 2020/07/13(月)20:53 ID:p7kPKe7n(1) AAS
>>156
ありがとうございます、昔に読んだのに URL を失ってしまって…ずっと探していたんです
158: 2020/07/13(月)21:24 ID:jVM2RLmn(1) AAS
>>155
ありがとうございます >>146 です
拝見いたします
159: [139] 2020/07/14(火)09:59 ID:obK0XQNS(1) AAS
ありがとうございます。いや、longjmp をdisるような意図は無かったんだけど。
「シグナルとコールバック」も勉強になります。

外部リンク[htm]:www.nurs.or.jp

この辺りは man を読んでも使い方が解りにくいので…
160: 2020/07/23(木)11:48 ID:3i8DjqKb(1) AAS
_sが付いてるやつ使えよ
161: 2021/05/21(金)17:59 ID:lDwsy5iU(1/2) AAS
関数じゃないけどこれやろ
If the unsigned type has conversion rank greater than or equal to the rank of the signed type, then the operand with the signed type is implicitly converted to the unsigned type.
うんこ
162
(1): 2021/05/21(金)18:32 ID:lDwsy5iU(2/2) AAS
プログラマを信じろと言うけどさ
じゃあ暗黙の型変換とか余計な節介やめてくれねーかな
163: 2021/05/21(金)18:36 ID:HkPQV5tP(1) AAS
cでまともに算数出来れば一人前
164: 2021/07/18(日)03:12 ID:a6CF+eHw(1) AAS
暗黙が嫌なら明示しろよばかじゃないの?
165: 2023/01/02(月)19:09 ID:N1W2ThUk(1) AAS
>>162
暗黙の型変換はワーニング出るようにできなかったっけ?
166: 2023/05/10(水)10:41 ID:zbvSAEuT(1) AAS
>>138
まとめがおかしい
啓蒙活動の結果gotoの有害な使い方は極めて少なくなった
というべきだろう
167: 2023/08/04(金)19:33 ID:+XXFTri2(1) AAS
ken thompsonがcreat()の最後のeを省いたのは失敗だったと
直すとしたらそこを直したいと
168: 2023/09/27(水)15:27 ID:0JeuaQMM(1) AAS
失敗は成功への近道だと思って取り組んでみよう。
169: 2023/09/30(土)09:21 ID:z8ssgezC(1) AAS
(”ロ”;)ゲゲッ!!
170
(1): 2023/10/03(火)12:21 ID:QaeBAOHS(1) AAS
型省略でintと看做すのはミスだろ
171: 2023/10/04(水)22:29 ID:pmZG4qtZ(1) AAS
>>170
K&Rの頃との互換性の為じゃないかな。

Cは、兎に角モノグサの為の様な仕様が多いよね。
一度馴染むと、BASICですら面倒くさい。
172: 2023/10/05(木)17:05 ID:WXXGTjkD(1) AAS
まんどくせ
173: 2023/10/05(木)19:40 ID:KP6Kmsv6(1) AAS
ポインタ渡し全般かな
174: 2023/10/05(木)22:17 ID:nm5oakcJ(1) AAS
Cの型はある意味pythonより弱い
175: 2023/10/07(土)11:48 ID:QSI1NZ2Z(1) AAS
ある意味というか、Pythonは一応強い型付けでしょ。
176
(1): 2023/10/07(土)11:51 ID:SZDGKzpf(1) AAS
Cに型なんかあって無い様なもんだしな
177: 2023/10/07(土)17:38 ID:2aizzJpQ(1) AAS
>>1
fgets知らんのかな
getsなんて使わない
どうしても使う時はfgets(buf,size,stdin)とすればいいだけ
178: 2023/10/08(日)10:11 ID:CrdCteTP(1) AAS
>>176
Cはアセンブラで言うところのアドレッシングが充実
179: 2023/10/09(月)15:00 ID:gMk1hFfQ(1) AAS
マクロが真っ黒
180: 2023/10/15(日)02:11 ID:LZ9c8wO/(1) AAS
∑(ノ▼ο▼)ノ オォオォオ!!
181: 2023/10/16(月)09:47 ID:kgcCjrnK(1) AAS
DDoS回避したみたいね
182: 2023/10/17(火)11:44 ID:xDsy3kB7(1) AAS
atan
(atan2の方じゃなくて)
183: 2023/10/18(水)07:26 ID:rpmqe4zi(1/2) AAS
くせの強いscanf()とか
184: 2023/10/18(水)07:26 ID:rpmqe4zi(2/2) AAS
くせの強いscanf()とか
185: 2023/10/18(水)14:31 ID:UTD5vf1X(1/2) AAS
visual studioでscanf()使ったらエラーになった
186: 2023/10/18(水)14:31 ID:UTD5vf1X(2/2) AAS
visual studioでscanf()使ったらエラーになった
187: 2023/10/20(金)09:24 ID:/M3RKJCH(1) AAS
free()
188: 2023/12/15(金)15:34 ID:dazO4Xak(1) AAS
sprintf()
189: 2023/12/17(日)07:31 ID:9k4gJxXV(1/2) AAS
fopen()
190: 2023/12/17(日)08:12 ID:9k4gJxXV(2/2) AAS
ctime()
191: 2023/12/31(日)16:48 ID:vzW4N1bb(1) AAS
fopen
192: 2024/01/06(土)17:10 ID:3kEfHLiK(1) AAS
strtok
193: 2024/02/01(木)07:45 ID:aKV2ok3G(1) AAS
freopen()
194: 2024/02/01(木)10:15 ID:oHnzHX84(1) AAS
アセンブラの補助言語に何期待してスレ立ててんだかw
195: 2024/03/16(土)16:31 ID:YyexUT5o(1) AAS
tmpnam()
196: 2024/04/02(火)13:56 ID:OXdmWprY(1) AAS
getenv
197: 2024/04/02(火)20:32 ID:yb6rvSIG(1) AAS
知ってる関数を並べるスレ
それにしても知らな過ぎるけどw
198: 2024/04/08(月)01:34 ID:BIzdd6FB(1) AAS
C言語自体が設計ミス
199: 2024/04/19(金)05:42 ID:uD5nyH4z(1) AAS
C言語はUNIXを作るために作ったんだから、それを流用したせいで、アプリケーションの作成には合わないところがあるのは当然。
200: 2024/04/20(土)15:12 ID:CogYy1zn(1) AAS
外部リンク:ja.wikipedia.org

「UNIXを開発するためにC言語が作り出された」と言われることがあるが、「The Development of the C Language」によると、これは正しくなく、経緯は以下の通りである。
C言語は、当初はあくまでもOS上で動くユーティリティを作成する目的で作り出されたものであり、OSのカーネルを記述するために使われるようになるのは後の展開である。
201
(1): 2024/10/02(水)13:09 ID:XbzwGALZ(1) AAS
char *a と char a[] を関数の引数でも一緒にしてしまったところ
202: 2024/10/04(金)12:11 ID:swUgCMz+(1) AAS
>>201
そこは長所では・・・?
203: 2024/10/04(金)13:36 ID:RixEjMnj(1) AAS
長所だらけで困るわ
204: 2024/10/06(日)00:28 ID:k+hD1Cqq(1/2) AAS
配列からポインタへの暗黙の変換があるんだから型としては別で良かったんだよ
おかげで配列全体の値渡しや代入ができなくなってしまった
205: 2024/10/06(日)00:39 ID:MZAtOKFs(1) AAS
無意識にそんなムダなことやられても困る
mallocとか使って明示的にやれるからいいだろ
206
(1): 2024/10/06(日)12:12 ID:onWt8ZIM(1) AAS
値で渡したかったら構造体で包めばいいし
逆に配列を値渡しするような言語って少ないんじゃないの
参照渡しするのばっかりだろ
207: 2024/10/06(日)13:06 ID:k+hD1Cqq(2/2) AAS
一貫性のない型があるとジェネリクスに支障が出る
C++はそれですごい苦労した挙句std::arrayみたいな馬鹿みたいなものができた
208: 2024/10/07(月)10:27 ID:1tKKan7C(1) AAS
>>206
結局フレキシブル構造体が仕様として認められてる以上、実体渡しも信用ならんのよ
struct chinko{
int a;
char b[0];
};

gccならこんなうんちもある
struct unko{
int a[0];
char b[0];
省1
209: 2024/12/13(金)17:18 ID:cICuvaCO(1) AAS
C++で気をつけなければならないのは
size_t i=10;
double x=3-i;
十分地獄を堪能できる。C言語もunsigned int使えば同じか
210: 2024/12/13(金)20:54 ID:3kdcRUf+(1) AAS
BEアイコン:nida.gif
EchoAPIをVS Codeで使い始めてから、開発プロセスが大きく変わった
211: 2024/12/21(土)10:57 ID:bIHzWCsd(1) AAS
strlen
212: 2024/12/21(土)17:09 ID:SDOaO/8s(1) AAS
シュトーレン
213: 2024/12/22(日)22:33 ID:63BRvCCZ(1) AAS
fork;execvp
214: 2024/12/29(日)07:02 ID:pX0TYs46(1) AAS
C言語には、組み込み関数なんてmainしか無いと思うなあ。
215: 2024/12/29(日)10:09 ID:Jnwqtt+s(1) AAS
面倒くさいからPOSIXは組込み扱いでいいよ
1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.558s*