C言語なら俺に聞け 156

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ 9bb7-/QqT)
垢版 |
2020/09/28(月) 14:41:30.00ID:QxfbhGyV0
!extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください)
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/

C11
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf

C99
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
http://kikakurui.com/x3/X3010-2003-01.html

C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/

JPCERT C コーディングスタンダード
https://www.jpcert.or.jp/sc-rules/

※前スレ
C言語なら俺に聞け 155
https://mevius.5ch.net/test/read.cgi/tech/1589120427/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2021/01/01(金) 00:20:48.66ID:E41TLeHr0
さあ
2021/01/01(金) 00:21:33.85ID:FRLcRufg0
吸い込んでくれ
2021/01/01(金) 00:34:01.79ID:ufA+vsC20
>>392 メモリクォータ違反とか?
2021/01/01(金) 00:36:53.19ID:cLHhn9Dx0
>>394
「malloc マルチスレッド」で検索すれば?
知らんけど。
2021/01/01(金) 01:47:49.68ID:gWHeIT9l0
>388
Win98か2000の頃にあったわ。
1kバイトぐらいのを数万回(ファイル数)mallocやろうとしたらNULL返した。
XPで試したらエラー出なかったけど。
2021/01/01(金) 05:55:11.31ID:ihSnxU6O0
逆にメモリ不足以外でNULL返すことってあるのか?
2021/01/01(金) 06:25:04.97ID:DIBn3EXs0
malloc(0)とか
2021/01/01(金) 12:48:57.97ID:U0IfpguFd
malloc(負の数)も
2021/01/01(金) 15:48:48.11ID:1v7huw3N0
負数は単に符号なしで評価してとんでもなくでかい領域を要求してるだけ?
2021/01/01(金) 21:47:45.23ID:DIBn3EXs0
だね
2021/01/01(金) 22:22:16.08ID:wEvOepYPd
sizeof(struct)*numとかごちゃごちゃ書くうちにうっかり0や負数になって…
というのはよくあった
406デフォルトの名無しさん (ワッチョイ dd5f-Jh9r)
垢版 |
2021/01/02(土) 11:42:56.15ID:QsP+Nlmq0
forループでunsignedで<0やって終わらないバグとかもあるな
2021/01/03(日) 00:53:19.09ID:ERUOHNUN0
>>406
それは正しい挙動じゃないかな。
強いて言えば、おせっかいでwarning出せばいい程度かと。
2021/01/03(日) 11:06:33.61ID:QdF5iATA0
>>407
正しい挙動 ≠ 想定した動作
2021/01/03(日) 11:12:17.27ID:3NmY3eCcd
この条件は必ずTRUEになりまっせー
というwarningはあったと思う
410デフォルトの名無しさん (エムゾネ FF62-Jh9r)
垢版 |
2021/01/03(日) 11:41:35.97ID:TDgWBZToF
<0は終わらないじゃなくて始まらないの間違いだった
2021/01/03(日) 13:51:43.57ID:3NmY3eCcd
unsigned int a;
for( a = 11; a > 0; a -= 2 ) ...

こんな感じのを作ってしまったことはあったな…
aは1のあと65535になるので永久に終わらず
aは0になる可能性もあるので条件式ではwarningも出ず
2021/01/03(日) 14:28:17.87ID:izXBuwpQd
>>407
#defineの値によって警告でちゃうから
おせっかいイラネ
413ビル・ジョブズ (ワッチョイ 8101-r+GE)
垢版 |
2021/01/04(月) 00:09:11.84ID:V9PboY9+0
mallocとか常に成功を返すんじゃない?
問題はそのアドレスに何か操作をした時。
MMUありの前提だけど。
2021/01/04(月) 00:29:40.79ID:NWAwlt7F0
実行してみないと使えるか分からないとなると
医療関係では使用禁止になるな
2021/01/04(月) 01:03:06.31ID:PMQqdXD/0
validation 通らないだろうねぇ
2021/01/04(月) 07:24:09.81ID:Nz2iXOdN0
>>413
メモリーオーバーコミットの話をしたいんだろうけどLinuxとかでも設定によるし>>414の言うように医療やECU等のようにそんなもんが許されない組込系の機器もあるから環境によるとしか言えんわな
417デフォルトの名無しさん (ワッチョイ dd5f-Jh9r)
垢版 |
2021/01/05(火) 12:05:40.60ID:G8BimKKu0
宇宙関係も無理やろね
2021/01/05(火) 12:12:18.79ID:8w5sr2J0d
失敗が絶対に許されないならmallocとか使うな
スタティックで確保しろ
2021/01/05(火) 13:27:41.97ID:zIEcR2TW0
一つのファイルポインタで読み書きする場合、読みと書きを切り替えるときに
fseek(fp,0,SEEK_CUR)等を挟むことはANSI Cにも書いてるわけですが、
挟まなくていい環境(Linuxとか)もありその実装上の違いってどうなってるんでしょうか?
バッファゼロにしてもfseekが必要なので、バッファリングってわけでもなさそうです。
420デフォルトの名無しさん (ワッチョイ c2a5-dZT0)
垢版 |
2021/01/05(火) 13:36:43.08ID:sz7Oy+6E0
https://github.com/gcc-mirror/gcc
ここからwindowsのfseekとlinuxのfseekを見つけ出す
2021/01/05(火) 14:23:40.55ID:N7gEH2Zs0
C の規格では OS とかの支援のない 「フリースタンディング」な環境にも言及していて、
フリースタンディング処理系は標準ヘッダ
float.h
iso646.h
limits.h
stdarg.h
stdbool.h
stddef.h
stdint.h
の内容に限定した機能が用意されてればよいことになってる。

malloc は stdlib.h だから無くても規格合致フリースタンディング処理系と名乗れる。
2021/01/05(火) 16:33:30.17ID:9HicEvTUd
>>413
あり得ない
malloc()で==NULLテストして「メモリーが足りません終了します」とかする事はできるが
確保した変数に読み書きした瞬間のエラーは感知する方法がないので
そこでエラーにされてもコアダンプして終了するしかない
ユーザー側から見たら未完成プログラムである
2021/01/05(火) 16:45:24.18ID:7nbNqUCud
ユーザーからしたら
エラーメッセージを出そうが突然死だろうが
メモリが足りなくなる事自体不完全プログラムだ

エアバッグが作動するときに、
[メモリ不足で動作できませんでした]
なんて表示されても何の意味もない
2021/01/05(火) 16:47:22.16ID:N7gEH2Zs0
>>422
やっとる (環境も多い) やろがい。
2021/01/05(火) 17:03:07.78ID:9HicEvTUd
>>423
それなら「エアバッグの数が多すぎるんだな」とか推論できるが
なんのメッセージもなく作動しなかったらユーザーはスピードメーター、ショックセンサー、安全装置などあらゆる関連部分を点検しなければならない
2021/01/05(火) 18:07:14.87ID:dzUtU5Ds0
そんな事はユーザーからすればどうでもいい
不完全な事にはかわりない
2021/01/05(火) 18:09:46.84ID:9HicEvTUd
ソフト作ったことない人だねw
メッセージの有無はバグが起きたときの対処に大きな違いがある
2021/01/05(火) 18:13:12.71ID:dzUtU5Ds0
メッセージの有無なんかよりも
動作するかどうか
の方がはるかに重要

メモリ確保が失敗する可能性があるところで
失敗が許されない動作に対してmallocを使うのが間違い
2021/01/05(火) 18:15:35.99ID:dzUtU5Ds0
適切なエラー処理をすればそれで十分
ソフト設計者のしたっぱの発想
430デフォルトの名無しさん (ワッチョイ 468c-qdLU)
垢版 |
2021/01/05(火) 18:35:11.65ID:zMZuOoIk0
>>423
読む人がいないならメッセージも無意味.
2021/01/05(火) 18:47:10.76ID:oFYQTpSv0
確保できないと返ってくれば対処方法はあるだろう
OK返されたあと、実際に使おうとしたら実はってなると
その分リカバリーが複雑になる
2021/01/05(火) 19:00:03.87ID:K71kt7oj0
ここの人はOOM Killerも知らんのか?
確保したプロセスが死ぬとは限らんのだが…
https://reboooot.net/post/kernel-params-related-to-oom-killer/
2021/01/05(火) 19:39:22.64ID:eT+iPfAP0
確保しようとしてエラーになったなら対処のしようもあるが、空手形乱発していざとなったら
関係ないプロセスが殺されるってのも困ったもんだよな。
初期のOSXはOOM Killerのような仕組みもなくてシステム全体が固まってたな。
2021/01/05(火) 19:58:11.78ID:dzUtU5Ds0
>>431
1秒後に再度確保?
バカ丸出し
2021/01/05(火) 20:01:22.72ID:8cFKE+AV0
お行儀よく死ぬ機構があるかどうか
2021/01/05(火) 21:50:05.77ID:9HicEvTUd
>>428
話が変わってるぞw
論理的に思考できない根本的にプログラマー向きじゃない人だな
>>429
どんな適切なエラー処理をすればいいのか
ご教示願いたいw
2021/01/05(火) 22:27:33.74ID:K71kt7oj0
>>436
> どんな適切なエラー処理をすればいいのか
ケースバイケース
前提示さずにこんな質問する奴はプログラマーに向いてない
2021/01/05(火) 23:58:57.29ID:zD1ciQHW0
OOM Killer は、Kubernetes のリソース制限の基本。
Linux のnamespace, cgroup

例外は、
アプリ例外は業務上のエラーだから、アプリで処理すべき。
システム障害などは、アプリで処理できる例外ではない
2021/01/06(水) 00:01:25.01ID:WT+BV7/+0
その分類上、メモリ確保失敗はアプリで処理すべきなのかどうかわかんなくない?
2021/01/06(水) 00:46:50.28ID:g4fxgipO0
mallocに失敗したらローカルで確保してみる
それが駄目なら一時ファイル作ってそこに格納する
他にも手はありそうだ
2021/01/06(水) 01:23:26.66ID:8o6ePSWp0
>>440
ねーよ間抜け
2021/01/06(水) 03:55:31.45ID:Sqdcyjlhd
>>437
ケースバイケース言いたいだけだったのかw
>>428
new使うだけでmallocされるのにそんな化石みたいなこと言われても
2021/01/06(水) 05:25:17.33ID:kVhO/tYW0
>>440
> mallocに失敗したらローカルで確保してみる
ローカルが何を意味してるのかわからんがローカル変数のことならはじめからローカル変数で確保しておくべき
2021/01/06(水) 05:28:43.74ID:kVhO/tYW0
>>442
> ケースバイケース言いたいだけだったのかw
言いたいだけって言うかそれ以外に言いようがないだろw
マジで言ってるならプログラマー失格レベル
445デフォルトの名無しさん (アウアウクー MMb1-Unlw)
垢版 |
2021/01/06(水) 07:24:13.29ID:bGGeDo6wM
アプリケーション開発しかやったことないのでシビアな状況のプログラムってのがよくわかってないけど

通常のプログラムだったらNULLが帰ってきたら終了だろうね

失敗が許されない環境で、もしメモリを使い果たして確保できないような状況の場合は失敗が許されないのにメモリを使い果たすようなプログラム自身を改善した方が良いような
ファイルから必要なデータだけを読み込むようにして使い終わったメモリは開放するとか

メモリを使い果たして無いのに失敗する可能性とかだったら、標準関数の正常な役割が信用できないという事になるのでプログラム言語自体使えなくなるよね
C/C++だけじゃなくて
それならアセンブラで直接書くしか無くなるのでは
この場合だったら「たらーれば」の言いがかりにしか聞こえないけど
2021/01/06(水) 09:52:33.41ID:NVCaEro60
そこんところはホスト環境・開発システムがどこまで保証するかという話になるので、
各環境で十分な保証があるなら使えばいいし、保証がないなら使えないというだけのことでは。

私も実態を知ってるわけじゃないが組み込み開発だったら
実際には保証というか自分たちで検証することも多いと思うが。
2021/01/06(水) 15:10:46.82ID:6EEBy3Y5d
Linux系にはヒープの上限を設定できないの?
よくある入門書にはnewで敵キャラでもエフェクトでも作って動かしましょうみたいなのがよくあるが
それやって消すのを忘れると一日動かしてるとかなりの容量になり突然システムが止まる
懐かしいシングルタスクOSの時代と変わらんw
Win16や32だとローカルヒープは上限があって一杯になってもアプリが止まるだけでシステムは続行できた
2021/01/06(水) 15:49:09.66ID:kVhO/tYW0
>>447
> Win16や32だとローカルヒープは上限があって一杯になってもアプリが止まるだけでシステムは続行できた
それはプロセス単位の制限だろ、man ulimit でググってこい
OOM Killerとかはシステム全体の話な
2021/01/06(水) 16:05:04.01ID:QohpZ5Jnd
>>446
Cスレだから組み込み系が話題の中心だと思ってたが
PCのアプリをCで書くなんて人がいまだにいるの?
2021/01/06(水) 17:27:30.00ID:NVCaEro60
>>449
ロジック部分を C で書くことはもうあまりないかもしれんが、
低レイヤや速度チューニングがなくなるわけではないからなぁ。
コードの総量に C が占める割合は少ないにしても
C が (一部には) 使われているものはまだまだあるんじゃね?
2021/01/06(水) 17:33:29.06ID:QohpZ5Jnd
アプリの速度チューンならC++で良いと思うんだが
なぜC?
2021/01/06(水) 18:33:49.31ID:m3At07SYM
>>447
ulimit -d でできるぽいね
2021/01/06(水) 18:53:37.18ID:kVhO/tYW0
>>449
LinuxのカーネルとかApacheとか未だにC言語は残ってるよ
新規は少なくなっていくだろうけどCOBOLと同様にメンテでは当面使い続けられると思うぞ
2021/01/06(水) 19:00:16.49ID:A7AJXFBH0
カーネルがmallocで失敗???
システムごと死ぬだろ
2021/01/06(水) 20:05:41.96ID:6EEBy3Y5d
>>448
だからアホなアプリ一個でシステムが止まるなんて前世紀の話か?と聞いてるんだよね
それともここはシステム関連の話だけか?
mallocの仕組みもしらずにシステムいじろうなんて命知らずの人だねw

>>452
シェルコマンドじゃなくて
このアプリちょっと試してみてよ、と他人に渡した時に行儀よくできるような言語自体のオプションはないものかな
mallopt()が近いみたいだけど英語ドキュメントしかないや
2021/01/06(水) 20:50:30.31ID:kVhO/tYW0
>>455
> だからアホなアプリ一個でシステムが止まるなんて前世紀の話か?と聞いてるんだよね
だから OOM Killer でググってこいよ
システムを止めるかどうかは設定によるし、Windows でもメモリー逼迫したら不安定になるから

> シェルコマンドじゃなくて
https://linuxjm.osdn.jp/html/LDP_man-pages/man2/setrlimit.2.html
そもそもシェルから設定できるのにプログラムから設定できないわけ無いだろ
プログラマーの素養なさ過ぎ
2021/01/06(水) 20:52:54.12ID:3ZsNazx6d
C言語なんだから無条件でPC前提にするのやめようぜ
2021/01/06(水) 20:58:31.92ID:3ZsNazx6d
Windowsでも
プロセスとスレッドのプライオリティを上げて
メモリを大量に使えば
スワップしまくって激重になって
事実上システムが死ぬけどね
2021/01/06(水) 20:59:44.32ID:3ZsNazx6d
アプリ1個でシステムダウンさせるのはそれほど難しくない
2021/01/06(水) 21:09:38.92ID:yUU4KxYw0
>>459
さすがにそれは不可能では?win3.1 ならまだわかるのですが‥‥
2021/01/06(水) 21:12:39.72ID:3ZsNazx6d
プライオリティの高いスレッドをたくさん作って無限ループすれば死ぬ
2021/01/06(水) 21:17:12.89ID:3ZsNazx6d
プライオリティ31のスレッドを論理コア数分作ればマウスカーソルも止まる
2021/01/06(水) 22:06:17.54ID:FKs+KUNY0
間違えてforkしまくるスクリプト実行してしまって何もできなくなった
2021/01/06(水) 22:06:21.76ID:6EEBy3Y5d
いや別に知恵を絞って無理に止める話はしてないじゃんw
うっかりミス程度で止まったらおそろしいなあ気楽にプログラミングもできないなあって話
2021/01/06(水) 22:38:40.29ID:g4fxgipO0
うっかりシステムをフォーマットしてしまうこともあるしな
2021/01/07(木) 00:44:03.16ID:Vx7SD3qO0
うっかりプライオリティの高いスレッドをいっぱい作っちゃった場合の話
2021/01/07(木) 02:16:41.45ID:yeIMGQh50
何の話してたか忘れた
2021/01/07(木) 15:11:57.86ID:9QJGSme00
mallocを使っていても総使用量の最大は見積もっとけって話
2021/01/07(木) 16:20:03.10ID:DL1zbij8d
総使用量に対してメモリが十分あっても
フラグメントで確保出来ないかもしれない
2021/01/07(木) 17:22:12.04ID:6v7F/BUW0
malloc をラップして
オレオレアローケーターで一括で確保して使いまわそうとすると
malloc の実装とほとんど変わらんよな?って気分になる
2021/01/07(木) 17:32:32.97ID:DL1zbij8d
固定長が多ければ専用化の価値が大きい
2021/01/07(木) 17:50:56.57ID:9QJGSme00
>>469
malloc実装してみな
フラグメントなんてどんな程度の問題かわかるから
2021/01/07(木) 19:23:46.37ID:jTCzKEfy0
とあるスコープ内だけで有効なヒープで、さらにスコープから抜けると開放したい
という用途でがんばった
2021/01/07(木) 20:07:04.52ID:b6arBunA0
何十日何百日稼働するソフトならそれなりに効いてきそうだけど<フラグメント
2021/01/07(木) 20:08:45.38ID:gAnZzjje0
>>473
alloca()
2021/01/07(木) 20:19:01.01ID:jTCzKEfy0
>>475
ほしかったがなかったのだ
2021/01/07(木) 21:26:54.87ID:gAnZzjje0
>>476
C にはデストラクタがないから、C の範囲で実現するのは困難ですね
alloca() の実装は、ライブラリだけでは処理できずにコンパイラ側の支援が必要だと思いますので、標準ライブラリには入りにくいでしょうね
2021/01/07(木) 21:43:59.65ID:jTCzKEfy0
>>477
longjmp は対象外とし
完全自動は諦めてスコープの外に回収関数を置く紳士協定で手打ちに
2021/01/08(金) 00:02:52.02ID:RWydUoCr0
>>472
フラグメントで確保出来ない事があったわけだけど
2021/01/08(金) 00:51:10.08ID:aEO+ezsE0
使ってるアロケータの実装が何なのか, とどう使っているか示さないと何の意味もない
K&R mallocに毛が生えた程度のmalloc (Tronとか)ならものすごい勢いで断片化するし

glibc mallocとかのbest fitアロケータを使う分には断片化はかなり起こりにくい

あとメモリリークじゃないことは間違いないんだよね?
2021/01/08(金) 05:16:18.16ID:gKD5AY0L0
>>479
>>388を再度問う
2021/01/08(金) 08:53:26.45ID:/42fFLGad
C言語スレなのに組み込みやったことないヤツばっかりってのが不思議

>>480
アロケータの実装次第で断片化がおこる
と自分で書いてるわけだ
それが答え

どんな優れたアルゴリズムでも
断片化はおこるんだけど
完全に未来が予測出来る神アルゴリズムでも
2021/01/08(金) 09:11:57.78ID:yPaAOWPid
Go/C/C++以外に直接システムコールしてる言語ってありますか?
2021/01/08(金) 09:18:29.89ID:/42fFLGad
アセンブラ
2021/01/08(金) 09:37:02.14ID:MUX0m4u5M
c/c++もアセンブラ使わないとシステムコール呼べないけどな
2021/01/08(金) 12:03:05.57ID:lqJPJl/10
CALL 5 が使える言語は全部大丈夫
2021/01/08(金) 12:52:43.97ID:0DW9z0rLM
>>486
call 5って何のこと?
2021/01/08(金) 14:24:17.01ID:PuoTeu6a0
>>477
VLA があれば alloca は要らん。
上限が見積もれないときはいずれにしても使うべきではないが……。
2021/01/08(金) 14:34:20.89ID:NkKDsd1u0
CALL 5ってシステムコール一般の事を指してるのかな?

CALL 5はCP/Mから引き継いだMS-DOSのファンクションコールか
ふつうMS-DOSはINT 21Hって内部割り込みつかってたけどCALL 5もできたそうな
2021/01/08(金) 15:15:28.39ID:/42fFLGad
直接システムコール
の定義によってはどの言語でも出来るし
定義によってはどの言語でも出来ない

質問者は定義を明確に
2021/01/08(金) 19:43:55.15ID:cUApPko30
>>488
でも VLA は C++ では非推奨でしょう?
というか C であっても VLA の格納位置がスタックなら、それこそ悪意を持つクラッカに格好の餌をやっているとしか思えません‥

C99 or later では「VLA の確保場所をスタック禁止でヒープとする」という縛りはあるのでしょうか?
2021/01/08(金) 21:47:27.82ID:cUApPko30
>>491,448,477
いろいろ調べたところ、私が間違っていることがわかりました、つまり alloca() はスタックに配列を確保する実装とのことだそうです
つまり alloca() は setjmp/longjmp と同じ「C で記述できない」関数ということになりますね‥‥
2021/01/08(金) 22:26:35.55ID:gKD5AY0L0
だからこそ標準に組み入れられているんだよ
非標準でどうしろと言うのか考えろ
2021/01/09(土) 13:37:23.88ID:lvRTpcj70
アセンブラで作ったサブルーチンをそうとは知らずに呼べるのはCの良いところ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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