C言語なら俺に聞け 152

レス数が1000を超えています。これ以上書き込みはできません。
1デフォルトの名無しさん (アウアウウー Sa4f-7DQ/)
垢版 |
2019/06/17(月) 18:27:10.41ID:3L1/L9kLa
!extend:checked:vvvvv:1000:512
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/
-
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
※前スレ
C言語なら俺に聞け 151
https://mevius.5ch.net/test/read.cgi/tech/1554171817/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured
2019/08/13(火) 10:40:59.48ID:+uxvNwqI0
>>926
・ret文で変なアドレスに飛ぼうとした場合、そのページが実行属性が付いていない
 場合や、そもそもページングされて無いアドレスであればページ例外が起きる。
 さらに、たまたまそのチェックがすり抜けても飛んだ先の命令列のうちのどこかが、
 存在しない命令パターンだったり、アプリでは使ってはいけない命令に
 なってしまっている確率も結構、高頻度で有ってその場合「不法命令外」
 というものが生じる・

・esp=ebpにされる際、espが4で割り切れるかどうかのチェック入る。だから、
 スタックが破壊された場合、3/4(4分の3)、即ち75%の確率でここで
 スタック保護例外が生じる。また、スタック・セグメントの範囲チェックで、
 大体、50%〜90%くらいの確率で異常が発見される。そして、これら二つの
 チェックで異常が発見される確率は、1-(1-0.75)*(1-0.5〜0.9)程度の確率となる。
 となり、僅かでもスタックのebpの保存場所にバッファオーバーランが派生した場合、
 結構な高確率で異常が発見される。大体、これだけでも、9割以上。

・上記は、偶然に異常が発見される確率。全ての確立を総合すると、
 1-(1-p_1)(1-p_2)・・・(1-p_n) のような形で偶然にして異常が発見されるが、
 チェック項目の個数 n が十分大きいと、割と即座に近い時期に異常がたまたま発見される
 確率は、99%位になっても不思議は無い。これは数学の話。
2019/08/13(火) 10:42:39.25ID:+uxvNwqI0
>>928
誤:なってしまっている確率も結構、高頻度で有ってその場合「不法命令外」
正:なってしまっている確率も結構、高頻度で有ってその場合「不法命令例外」
2019/08/13(火) 10:48:21.44ID:bI98bSLia
確立って書くのは例外なくアホ
2019/08/13(火) 10:50:03.67ID:rjuNmU8i0
変換ミスだよ。
2019/08/13(火) 11:41:48.81ID:/0JIigTLd
フン、難しすぎてチンプンカンプンだぜ
2019/08/13(火) 12:09:25.81ID:rjuNmU8i0
>>927
20年前1999年くらいに起きた変化だとすれば、単純にOSがCPUのプロテクト
モード(保護モード)で(ちゃんと)動作するようになった影響だと考えられる。
2019/08/13(火) 12:15:52.88ID:AAd69x7F0
まだちゃんと動作していないよ
CPUがなんちゃってプロテクトモードだから
2019/08/13(火) 12:16:04.12ID:RSblMGL30
>>933
ユーザーアドレス空間をいちいちチェックしているとは思えませんが…
936デフォルトの名無しさん (アウアウウー Sa39-H0Mu)
垢版 |
2019/08/13(火) 12:41:24.24ID:2qtnUYLta
95や98とXPは違う、っていうなら単純にOSの違いが影響していると思われ
2019/08/13(火) 14:07:38.62ID:rjuNmU8i0
>>935
プロテクトモードだとCPUが常にチェックし続けてますよ。
3.5GHzとかで、1命令実行するたびにチェックしながら動いています。
ハードウェアレベルでそういうチェック機構がCPUの内部に入っているので。
2019/08/13(火) 16:10:25.29ID:74dfGXTi0
ソフトと違い、ハードでのチェックは処理時間を遅延させないからな
2019/08/13(火) 17:04:27.47ID:5q1NdOKU0
>>938
厳密にはそれは言い過ぎ。
2019/08/13(火) 17:08:00.20ID:74dfGXTi0
V=Rは速いとか言いたいのか?
2019/08/13(火) 17:48:57.55ID:b87Bd4Qh0
最近はあまりないけどMMUの処理で1サイクル遅延するハードとかもあったよ
要するに「常に」処理時間を遅延させないってわけじゃないってことな
2019/08/13(火) 19:33:45.29ID:rjuNmU8i0
>>941
現代のCPUでは、パイプラインを使っているのである程度重い処理であっても、
速度低下には繋がらないような仕組みがあります。
結構複雑なMMUの処理が入っても1命令の実行速度の低下は全く無いことが
多いです。
2019/08/13(火) 19:56:23.66ID:tpzkwMyE0
そこまでやってくれるのにバッファオーバーラン自体はチェックしてくれんのですか
2019/08/13(火) 20:04:59.83ID:AAd69x7F0
最近のCPUでの脆弱性がどうして起きているか,誰か解説して
2019/08/13(火) 20:05:05.08ID:UammDDeWa
まあそっちはばるぐりどんの仕事だよね。
最近は全然関係ないところでバスエラーが発生する様なプログラムはあんまり見なくなったわ。新規に作り込むことはないだろうし、古いコードもあらかた直したし。
2019/08/13(火) 20:23:31.85ID:b87Bd4Qh0
>>942
通信簿に人の話をあまり聞いてないとか書かれたことない?w

> 最近はあまりないけど
2019/08/13(火) 22:27:20.37ID:mICjniMU0
>>943
バッファオーバーランはプログラム上の論理的な境界の問題だから、ハードウェア的に一律に処理することはできないよ
948デフォルトの名無しさん (ワッチョイ daad-LRiH)
垢版 |
2019/08/13(火) 22:48:57.58ID:1mKsD1EO0
バイト単位でマスク掛けてそこからはみ出すアクセスで割り込みできればなんとかなりそう。
2019/08/14(水) 13:20:34.48ID:FpyX88UP0
仮想アドレスってどう実装されてるの?
86系はセグメントで先頭アドレス決めてるだけだろうけど。
2019/08/14(水) 13:30:00.49ID:29pnbISy0
>>949
仮想86モードのこと?
2019/08/14(水) 13:51:20.29ID:xanGzDta0
>>949
ページングの話なのかセグメントの話なのか
2019/08/14(水) 14:20:06.89ID:meO8Vw3B0
>>951
一応、x86系(IA32)で、仮想アドレスというと大体ページングの方をさし、
セグメントの方は、二部分アドレス、などということが多いことは多い。
2019/08/14(水) 14:29:06.01ID:xanGzDta0
>>952
それはそうだが>>949
> 86系はセグメントで先頭アドレス決めてるだけだろうけど。
って書いてるので何を知りたいのかよくわからん
2019/08/14(水) 15:01:22.77ID:meO8Vw3B0
>>949
記憶に頼って書くので、少し間違いがあるかもしれないが、IA32では、
・仮想アドレスの4KBの領域が1ページと呼ばれる。
・それぞれのページの先頭アドレスには好きな物理アドレスを割り付けることが
 出来る。また、ページごとに、R,W,E 属性などを ON/OFF できる。
 Read/Write/Execute ができるかどうかを指定できるということ。
・1024個のページのをまとめてテーブルにして、そこにそれぞれのページの
 上記情報をまとめて書く。このテーブルは連続した4MBの仮想アドレス領域
 に対応している。このテーブルは、1ページあたりが4バイトになっていて、
 「エントリ」と呼ばれる。4バイトのエントリが1024個集まって1つの
 テーブルを形作り、「ページテーブル」という。ページテーブル自体も
 また4KBになっていて、ページのサイズと同じになっている。
・さらに、このページテーブルの先頭アドレスを1024個分まとめて書いた配列があり、
 ページディレクトリと呼ばれる。既に述べたようにページテーブルが仮想アドレス
 4MB分を管理するので、1024個分まとまると 4MB * 1024 = 4GB 分を管理
 することができるようになる。これで2^32=4GBに相当するので32BITのアドレス
 空間全てを管理できるようになる。
・ページテーブルの中には、物理アドレスを割り付けないページを作ることも出来る。
・ページディレクトリも、ページテーブルを割り付けないエントリが有っても良い。
・ページディレクトリが置かれた物理アドレスは、CPUの特殊な専用レジスタの中に
 入れられる。
・ぺージディレクトリ、ページテーブルの情報は、メモリアクセスを伴うマシンご命令を
 実行する際に必ず必要になるので、高速化するため、TLB(Translation Lookaside Buffer
 、アドレス変換バッファ)という専用のキャッシュ領域に格納されて、とても高速に
 処理できるようになっている。TLBのキャッシュをクリアして再度構築する(読み込む)
 には、結構時間がかかるといわれており、これがOSのプロセス(タスク)切り替えの
 大きなオーバーヘッドを生むといわれている。
2019/08/14(水) 15:11:00.14ID:meO8Vw3B0
>>949
なお、WindowsやLinuxでは、セグメンテーションの方は積極的には
ほとんど使っておらず、意味がある使い方をしているのはページングの方だけ。
だから、デファクトスタンダードのOSは、ほぼ全てページングだけを使っている
と言っても過言では無い。セグメンテーションは、スタック領域(esp,ebp)の
ためだけにはやや意味のある使い方がなされる場合があるかも知れない。
というのはスタック領域については、CPUの保護がちょっとだけ強く保護できる
仕組みを持っているが、それがセグメンテーションの仕組みを使っているから。
例えば、仮想アドレス領域の一部だけをスタック領域にして、そこからはみ出た
場合には保護例外を発生させたいような場合には、セグメンテーションが利用できる。
上手く使えば、スタックの自動伸張にも使えないことも無い。ただし、
自動伸張にか関してはそんなに上手く使いこなせる仕組みでも、そんなに
効率が上げられる訳でもない。再帰関数の何度も呼びすぎてスタック
を使いすぎた場合にプログラマにエラーを表示するような目的には
使おうと思えば使える。
2019/08/14(水) 17:57:06.94ID:vUE0DVkpM
いくつか補足

>>・仮想アドレスの4KBの領域が1ページと呼ばれる。
今のx86では4MB、x64では2MBのページや1GBのページも使え、メモリ使用効率を犠牲にして大量のメモリを使うプログラムのパフォーマンスを上げられるようになっている。

>>・それぞれのページの先頭アドレスには好きな物理アドレスを割り付けることが出来る。また、ページごとに、R,W,E 属性などを ON/OFF できる。
先頭アドレスが設定できるアドレスは4kB毎。x86でのExecute指定はPAEが有効な時のみ

>>・1024個のページのをまとめてテーブルにして、
x64とPAE有効なx86では8バイト512エントリ

>>・さらに、このページテーブルの先頭アドレスを1024個分まとめて書いた配列があり、ページディレクトリと呼ばれる。
x64では512エントリのテーブルが4段で1ページ4kBだから、4*9+12=48ビットの物理メモリまで指定できる

>>例えば、仮想アドレス領域の一部だけをスタック領域にして、そこからはみ出た場合には保護例外を発生させたいような場合には、セグメンテーションが利用できる。
x86では出来るが、ページングで自動伸長やスタックオーバーフロー検出を特に問題なくできるからわざわざ使わないし、x64ではベースとリミットが廃止されたから不可能

あと、x64で互換モード(32bit)とlongモード(64bit)の切り換えはコードセグメントの設定で自動的に行われるから、そのためには最低2つのコードセグメントが必要
2019/08/14(水) 17:58:59.46ID:8Ip/utt6a
>>949
セグメントと仮想アドレスは別物だぞ?
セグメントはあくまで絶対アドレス、仮想アドレスはページングを使ったプロセス毎のリニアメモリ再構築。
2019/08/14(水) 18:05:09.36ID:WgtMp1yE0
おまいら詳しいな
いつも煽るだけのジジイとは大違いだ
2019/08/14(水) 18:23:42.77ID:5CXVdP5r0
仮装はドレスって何よって空目した
2019/08/17(土) 06:23:28.66ID:Zf+OyZFy0
CPUの振る舞いは、MS-DOS時代から触っていたら、OSを直接触る仕事して無くともそれなりに身に付く知識。

90年代の雑誌の記事とか、今見返すと結構適当な言い回しがおおいかなー。
961デフォルトの名無しさん (ワッチョイ 2b82-9R4q)
垢版 |
2019/08/17(土) 14:33:53.72ID:1OZ5Sjcw0
設計から組み込みの部門に転籍したいんやけど応用情報取ればアピールになる?
2019/08/17(土) 14:38:02.51ID:5o1qwOfF0
>>961
なんでここで聞くんだよ
スレタイ読めないのか?
2019/08/17(土) 14:43:11.82ID:hkO+8710d
>>961
プログラマ板へGo!
964デフォルトの名無しさん (ワッチョイ 2b82-9R4q)
垢版 |
2019/08/17(土) 15:13:05.00ID:1OZ5Sjcw0
>>962
うるせーハゲ質問に答えろハゲ
965デフォルトの名無しさん (ワッチョイ 2b82-9R4q)
垢版 |
2019/08/17(土) 15:13:17.45ID:1OZ5Sjcw0
>>963
サンキュー行ってくるわ
2019/08/17(土) 15:20:15.01ID:5o1qwOfF0
>>964
なら答えてやろう

お前には無理だ
資格云々言う前に人として問題がある
2019/08/17(土) 16:42:17.15ID:kME64/ZP0
>>961
アピりたいなら高度のESぐらいは取らないとだめだと思う
そもそも自分の職種を「設計」って言う奴はもれなく仕事できない奴だから無理だと思うが
2019/08/17(土) 16:43:30.63ID:ToRIVhzM0
>>961
アマチュアなので業界のことはよくわかりませんが、私の経験では応用情報なんて準備なしでもサクサク合格できる非常に簡単な試験だったので
そんな馬鹿でも取れる試験を通ったところで、他人様にアピールできる要素なんて皆無だと思います
まあ取らないよりはましかもしれませんが、とったところで、どうということもないかと
2019/08/17(土) 16:59:25.44ID:m0TaYC720
資格を取るより、何か作ったほうがいい
それは何かを他人に説明できるものをな
最後までやり遂げるやつってアピールになる
970デフォルトの名無しさん (ワッチョイ 2b82-9R4q)
垢版 |
2019/08/17(土) 18:18:25.12ID:1OZ5Sjcw0
>>966
うるせーハゲ
971デフォルトの名無しさん (アウアウウー Sa5d-9R4q)
垢版 |
2019/08/17(土) 18:26:43.42ID:iM/i00oRa
>>968
馬鹿でも取れる資格で合格率2割か…世の中は馬鹿ばっかりと思ってる仕事できない人ですか?
2019/08/17(土) 18:44:53.30ID:z2aQSF8W0
隙あらば自分語り
しかも応用情報所持者は馬鹿ときたもんだ
5chでコテハン付けてる人間にはろくなのが居ないのが良く分かるわ
2019/08/17(土) 18:58:47.65ID:WCU4L4CL0
>>968
×バカでもとれる資格
◯取れたバカもいた資格
2019/08/17(土) 19:08:20.21ID:ToRIVhzM0
>>971
実際馬鹿みたいに簡単な試験でしたから「世の中馬鹿ばかり」と勘違いする人もいるかもしれません、私はそうじゃありませんが

>>973
まあ、そういう可能性も排除するつもりはありません
2019/08/17(土) 19:11:05.65ID:ToRIVhzM0
>>972
コテハンじゃありません、トリップです(霧)
2019/08/17(土) 19:16:49.07ID:5o1qwOfF0
>>970
煽り能力も低いのか
クソ以下だな
2019/08/17(土) 19:48:38.79ID:W0yISC1Ja
普段、eclipseでコード書いてるんだが実行環境を使わずにプログラムを動かしたいんだいんだ。
どうすれば良い?
2019/08/17(土) 19:54:59.62ID:G9Jg/NxrM
実行環境が曖昧過ぎ
2019/08/17(土) 19:59:53.93ID:He41kTu90
https://paiza.io/ja
この類を使うとか?
2019/08/17(土) 20:07:35.05ID:hkO+8710d
オンラインコンパイラーで検索。
2019/08/17(土) 21:57:43.31ID:Gq1G0TGXd
コンピューターサイエンスの勉強に最適な言語ってCですか?
雰囲気でPythonやらGoを実務で使ってるのでもっと核を学びたいのです
2019/08/17(土) 22:04:17.39ID:hkO+8710d
>>981
アセンブリとCをやって、OS自作し、機械語を読めるくらいになったら間違いない。ただし、アセンブリやるならCPUの種類は選べ。マイナーなCPUを勉強しても役に立たない。
2019/08/17(土) 22:05:10.03ID:RvVfsurb0
低レベルの勉強がしたいならアセンブラ
もっと低レベルなことがしたいならはんだごて買ってきて論理回路を勉強すべき
2019/08/17(土) 22:11:48.46ID:aitIb0FAd
>>982
>>983
時間があればその辺まできっちりやりたいですね。この前秋葉で面白そうな本ありましたし

実務で役に立てそうな知識も身に付きますか!?
2019/08/17(土) 22:14:40.96ID:RvVfsurb0
業務で使ってるのが高級アセンブラじゃなくて
モダンな高級言語なら業務の役には立たないだろうな

デザインパターンやプログラム以外の知識を真面目に学んだ方が業務の役には立つぞ
2019/08/17(土) 22:17:08.29ID:hkO+8710d
>>984
大規模開発やりたいか、小規模開発やりたいかによる。大規模開発ならオブジェクト指向とか上流のシステム設計とかの高レベルの視点が必要になる。
2019/08/17(土) 22:20:20.48ID:RvVfsurb0
小規模でも継続して開発するなら開発手法や設計の知識がないと全てがスパゲティになるぞ
2019/08/17(土) 22:21:39.58ID:CuykVau60
コンピュータサイエンス学ぶのにアセンブラと言ったらまずはMMIXだろう。
2019/08/17(土) 22:22:45.34ID:iu5AFmQqd
>>985
>>986
デザインパターンとか設計とかはもちろん勉強してます!

加えて低レイヤーの理解が深まったらパフォーマンスの良いコード書けるのかなと思ったのですがそうでも無いんですね
2019/08/17(土) 22:27:25.97ID:RvVfsurb0
パフォーマンスの良いコード書きたいなら
現実的には使ってる言語の仕様を深く理解する方が先
2019/08/17(土) 22:31:40.98ID:ToRIVhzM0
>>982
アセンブラをやれる手軽な環境ってありますかね…
gcc のインラインくらいしか思いつかない

そもそも、アセンブラ記述が効果的なアルゴリズムってありますかね…
キャリーフラグを触れるメリットが生かせるのは多桁長演算くらいしか思いつきません
2019/08/17(土) 22:32:21.84ID:ToRIVhzM0
>>988
クヌース臭くてちょっち引きます…
2019/08/17(土) 22:36:17.56ID:hkO+8710d
今からアセンブラやるなら、gasかnasmが移植性が高く手頃だと思う。

OSのカーネルではCかアセンブラじゃないと信頼できない。割り込みはアセンブラじゃないと記述できないことがある。
2019/08/17(土) 22:50:13.63ID:hkO+8710d
Java仮想マシンのバイトコードも仮想アセンブラの一種と言えるのではないか。

最近ではLLVMというコンパイラ技術基盤があって、それを使えば仮想アセンブラというか中間言語でも高レベルの最適化ができる。

あくまで仮想だから本当のアセンブラとは言えない。
2019/08/17(土) 22:56:25.40ID:mO2DYsgBa
低レイヤやってきたおっさんのスタンスは「動けばなんでもいい」が普通なので、なるべく同じ道は進んで欲しくない
2019/08/17(土) 22:59:12.98ID:gRAatMdn0
仮想アセンブラなんて言葉は、初めて聞いた

違和感ありすぎる
2019/08/17(土) 23:02:35.66ID:ToRIVhzM0
>>994
私は VM コードなんて「嘘くさくて」アセンブラに数えたくないし、仕様を把握する気にもなれません
LLVM は所詮コンパイラ内の中間言語であって、バイナリーではないと思っています
2019/08/17(土) 23:03:01.96ID:tN5mSQYg0
C言語なら俺に聞け 153
https://mevius.5ch.net/test/read.cgi/tech/1566050562/
999デフォルトの名無しさん (ワッチョイ 29a0-R2Ej)
垢版 |
2019/08/18(日) 01:31:11.17ID:0XNdGcXI0
やっぱコテハンってゴミだな
2019/08/18(日) 01:43:12.61ID:f2ZPM7Xhd
五チャンネルの株式総会はこれで閉会と致します。お疲れ様でした。
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 61日 7時間 16分 2秒
レス数が1000を超えています。これ以上書き込みはできません。