パスワードを忘れた? アカウント作成
12276369 story
GNU is Not Unix

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を使えるのはずいぶん先になりそうである。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by Anonymous Coward on 2015年07月20日 21時57分 (#2850618)

    >まともなOSとCPUはこれを検知してSIGSEGVを発行する。

    OSがレジスタ監視してたらそれって効率低下とかならないんですか?
    この辺の知識まったくないので、結構驚きました。

    • by jzkey (47353) on 2015年07月20日 23時17分 (#2850641)
      そのバグにかいてあるのは、short x3の構造体にアクセスするコードが、[8byte read, レジスタの6byte部分の変更、8byte書き戻し]にコンパイルされるから、構造体がページの末尾にあったときにover readでsegvになる、って話。
      親コメント
      • by Anonymous Coward

        そういうfaultが発生したときのシステムの挙動ってどうなるの?

        1.CPUは動作を停止する
        2.CPUはエラーの割り込み発生するが、実は割り込み処理のコードが無くてreturnで戻ってくるだけ
        3.ちゃんと割り込み処理のコードがあってOSはエラー発生を検知するが、リカバリーの処理はしない(ログを取るだけ)
        4.OSは割り込みを検知したら、アプリケーションレベルでの何らかの誤り訂正等の処理をする

        たぶん3か4じゃないかと思うのだが......

        • by Anonymous Coward on 2015年07月21日 11時14分 (#2850760)

          例外の種類とOSによる。

          管理領域違反とかは、カーネルに処理が戻った時にレジスタとかバックトレースだけ回収して問答無用でアプリケーションを落とすのが普通。
          組み込みとかだと、例外通知だけして復帰も有り得るかもしれん。

          多分一番身近な例外は、キャッシュミス(TLBミス)とかページフォルトで、この場合はカーネル側でデータのロードを行って、そのまま処理に戻るのが普通。

          親コメント
          • by Anonymous Coward

            例外(シグナル)を捕捉する処理をアプリケーションが持ってればそこに飛んでくだけで、
            メモリアクセス程度では問答無用でアプリケーションを落とすような事は少ないですよ。
            例外を捕捉しない場合もOS等の提供するデフォルトの例外処理が自殺なだけの事も多い。

            • by Anonymous Coward

              管理領域違反つってんのに…

              • by Anonymous Coward

                例えばCで*((int*)rand())=0;すると例外処理してても強制終了される場合があるという主張ですか?
                ユーザモードのメモリ空間にはカーネルモードのアクセス禁止なデータなんてマップされませんよ。
                マップ済みならアクセスフラグに違反したら例外出るけど補足できるし、未マップ領域は当然例外で補足できます。

                たとえ乱数で埋まった不正命令まみれのメモリ領域にジャンプしても、
                例外機構自体を破壊したり強制終了処理を呼ばなければまず落ちませんて。

                敢えてユーザ空間にマップしといてアプリの例外処理に飛ぶ前に握りつぶすOSはあるのかもしれませんが、
                どの道アクセス出来ないのは変わらないし悪意の立証も出来ない。意地が悪いだけで意味が無いでしょう。

              • by Anonymous Coward

                だから例外の種類とOSによる、って書いてあるのに(俺が書いたんじゃないが)、なんでunixのモデルから頭が離れられないの

        • by Anonymous Coward

          >そういうfaultが発生したときのシステムの挙動ってどうなるの?

          SIGSEGV。

    • by Anonymous Coward

      OSがレジスタを監視しているのではなく、予めメモリの領域ごとにアクセス保護を設定しておいてあって、設定に反するアクセスを行うと例外(割込)が発生するということになります。

      jzkey さんのコメント(#2850641)にある『構造体がページの末尾にあったときに』というのは、ページを跨がない場合は設定に反することなくアクセス出来てしまうので例外が発生しないということです。

      詳しくはMMUについて勉強すると良いと思います。

    • by Anonymous Coward

      レジスタに値を取り込む為の「メモリアクセス」で例外が起きます。
      メモリアクセス時に仮想アドレスから物理アドレスに変換したりする処理の中で引っかかるはず。
      CPUが自動的に行う処理の中でOSから指定された条件を満たせばCPUが例外処理に移行します。
      予め設定された条件を見たさなければ例外処理は起きないので、そこまでの効率低下は起こりません。
      逆に、こうして処理される例外の中でも時間がかかる代表がディスクアクセスを伴うページフォルト。

      仮想アドレスから物理アドレスに変換するのはハードで処理されるとは言え若干の効率低下を伴うはずだけど、
      仮想アドレスの利点の方が大きいから組み込み以外ではそんなこと気にせずバンバン使う。
      その辺りの機能はメモリ保護と絡めて使うこともできるから、セキュリティ的にも美味しい。

  • by Anonymous Coward on 2015年07月21日 7時40分 (#2850687)

    アナウンス内容だったらgcc.5.1.1でもいいような気が…
    大きくバージョンあげなきゃいけないのはなんで何でしょうか?

typodupeerror

日本発のオープンソースソフトウェアは42件 -- ある官僚

読み込み中...