GCC 5.2リリース 24
ストーリー by headless
修正 部門より
修正 部門より
あるAnonymous Coward 曰く、
7月16日、GCC 5.2がリリースされた。バグの修正が中心のリリースで目立った機能の追加等はないが、修正されたバグの中にはいくつか興味深いものがある(変更点、 OSDN Magazineの記事)。
たとえばBug 36043は、関数呼び出しでサイズが2^nバイトでない構造体を渡した際に、レジスタに展開される場合のアライメント処理に問題があり、SIGSEGVが起きるというものだ。これは実際のデータよりも多めにレジスタに読まれるだけなので、プログラムの動作自体には問題ないはずだ。ただし、管理領域の外のページがレジスタ上にロードされる可能性があり、まともなOSとCPUはこれを検知してSIGSEGVを発行する。この様な基本的なバグがまだ残っていたというのは驚きである。
その他、C++周りでペーストミスとみられるバグが修正されたり、std::nullptr_tのアライメントが変更されたりしている。また、GCCは変数テンプレートとconstexprとODRが組み合わさってリンクエラーが発生する傾向があったが、それについても修正されている。安定的にC++14を使えるのはずいぶん先になりそうである。
OSってレジスタ監視してんだ。 (スコア:0)
>まともなOSとCPUはこれを検知してSIGSEGVを発行する。
OSがレジスタ監視してたらそれって効率低下とかならないんですか?
この辺の知識まったくないので、結構驚きました。
Re:OSってレジスタ監視してんだ。 (スコア:3, 参考になる)
Re: (スコア:0)
そういうfaultが発生したときのシステムの挙動ってどうなるの?
1.CPUは動作を停止する
2.CPUはエラーの割り込み発生するが、実は割り込み処理のコードが無くてreturnで戻ってくるだけ
3.ちゃんと割り込み処理のコードがあってOSはエラー発生を検知するが、リカバリーの処理はしない(ログを取るだけ)
4.OSは割り込みを検知したら、アプリケーションレベルでの何らかの誤り訂正等の処理をする
たぶん3か4じゃないかと思うのだが......
Re:OSってレジスタ監視してんだ。 (スコア:1)
例外の種類とOSによる。
管理領域違反とかは、カーネルに処理が戻った時にレジスタとかバックトレースだけ回収して問答無用でアプリケーションを落とすのが普通。
組み込みとかだと、例外通知だけして復帰も有り得るかもしれん。
多分一番身近な例外は、キャッシュミス(TLBミス)とかページフォルトで、この場合はカーネル側でデータのロードを行って、そのまま処理に戻るのが普通。
Re: (スコア:0)
例外(シグナル)を捕捉する処理をアプリケーションが持ってればそこに飛んでくだけで、
メモリアクセス程度では問答無用でアプリケーションを落とすような事は少ないですよ。
例外を捕捉しない場合もOS等の提供するデフォルトの例外処理が自殺なだけの事も多い。
Re: (スコア:0)
管理領域違反つってんのに…
Re: (スコア:0)
例えばCで*((int*)rand())=0;すると例外処理してても強制終了される場合があるという主張ですか?
ユーザモードのメモリ空間にはカーネルモードのアクセス禁止なデータなんてマップされませんよ。
マップ済みならアクセスフラグに違反したら例外出るけど補足できるし、未マップ領域は当然例外で補足できます。
たとえ乱数で埋まった不正命令まみれのメモリ領域にジャンプしても、
例外機構自体を破壊したり強制終了処理を呼ばなければまず落ちませんて。
敢えてユーザ空間にマップしといてアプリの例外処理に飛ぶ前に握りつぶすOSはあるのかもしれませんが、
どの道アクセス出来ないのは変わらないし悪意の立証も出来ない。意地が悪いだけで意味が無いでしょう。
Re: (スコア:0)
だから例外の種類とOSによる、って書いてあるのに(俺が書いたんじゃないが)、なんでunixのモデルから頭が離れられないの
Re: (スコア:0)
>そういうfaultが発生したときのシステムの挙動ってどうなるの?
SIGSEGV。
Re:OSってレジスタ監視してんだ。 (スコア:1)
底抜けに親切な御仁だ
Re: (スコア:0)
OSがレジスタを監視しているのではなく、予めメモリの領域ごとにアクセス保護を設定しておいてあって、設定に反するアクセスを行うと例外(割込)が発生するということになります。
jzkey さんのコメント(#2850641)にある『構造体がページの末尾にあったときに』というのは、ページを跨がない場合は設定に反することなくアクセス出来てしまうので例外が発生しないということです。
詳しくはMMUについて勉強すると良いと思います。
Re: (スコア:0)
レジスタに値を取り込む為の「メモリアクセス」で例外が起きます。
メモリアクセス時に仮想アドレスから物理アドレスに変換したりする処理の中で引っかかるはず。
CPUが自動的に行う処理の中でOSから指定された条件を満たせばCPUが例外処理に移行します。
予め設定された条件を見たさなければ例外処理は起きないので、そこまでの効率低下は起こりません。
逆に、こうして処理される例外の中でも時間がかかる代表がディスクアクセスを伴うページフォルト。
仮想アドレスから物理アドレスに変換するのはハードで処理されるとは言え若干の効率低下を伴うはずだけど、
仮想アドレスの利点の方が大きいから組み込み以外ではそんなこと気にせずバンバン使う。
その辺りの機能はメモリ保護と絡めて使うこともできるから、セキュリティ的にも美味しい。
gcc5.1.1じゃだめだったんでしょうか? (スコア:0)
アナウンス内容だったらgcc.5.1.1でもいいような気が…
大きくバージョンあげなきゃいけないのはなんで何でしょうか?
Re:gcc5.1.1じゃだめだったんでしょうか? (スコア:2)
大きくバージョンがあがったように見えるのは,GCCがナンバリングのルールを変更したからです
今回の 5.2 は,従来のルールでナンバリングすると 5.0.2 に相当するもので,要はバグフィックス版です
バグフィックス版ですので目立った新機能はありません.
(厳密には一点だけ新機能追加があり,AMD用の命令セット monitorx と mwaitx に対応するようになってます)
2016年に GCC 6 がリリースされる予定ですが,これが次期メジャーアップデート版になります
https://gcc.gnu.org/gcc-6/changes.html [gnu.org]
今後 GCC 5.3,GCC5.4がリリースされるかもしれませんが,それらはバグフィックスリリースになります.
Re:gcc5.1.1じゃだめだったんでしょうか? (スコア:1)
どうも最近バージョン番号がインフレ気味である。
Re: (スコア:0)
ちょっと前まで2.95くらいだったと思ってたのに、いつの間にか5まで行ってたのか。
4は記憶にない…。
Re: (スコア:0)
どんだけ浦島太郎なん?
https://www.gnu.org/software/gcc/releases.html [gnu.org]
Re: (スコア:0)
Re: (スコア:0)
×なんで何で
Re: (スコア:0)
嘘をつくな
Re: (スコア:0)
嘘/な/の/でしょうか?
Re: (スコア:0)
嘘何です
Re: (スコア:0)
自分で正解を書かない正解乞食は無条件で嘘とみなすことにした。
Re: (スコア:0)
https://gcc.gnu.org/develop.html [gnu.org] を読むと、x.y.1はx.y.0のリリース後のスナップショットってだけで、x.y.1をリリースする分けじゃない見たいですね。x.y.0の後に修正がたまって、もう一度リリースする時は、その時点でのx.y.1をx.y+1.0に移す様です。
なので、リリース版のみを使うユーザーとしては、x.yしか意味は無いようです。
私、以前 http://srad.jp/comments.pl?sid=657068&cid=2805220 [srad.jp] と書いたのですが、どうやらちょっと勘違いしてました。