ブックマーク / cpplover.blogspot.com (6)

  • Archユーザー、rm -rfしてMSIのラップトップのUEFIのバグを発見する

    No POST after rm -rf / / Kernel & Hardware / Arch Linux Forums No POST after rm -rf / | Hacker News Mount efivarfs read-only · Issue #2402 · systemd/systemd Archのインストールを消去したかったので、遊びのためにMSIのラップトップで"rm -rf --no-preserve-root /"してみたArchユーザーのラップトップが文鎮化してしまった。なぜだ。 調査の結果、おそらく/sys/firmware/efi/経由でEFI変数(EFIの規格で定められているマザーボードが提供する小容量の不揮発ストレージ)に書き込みを行ったためだと判明した。 EFI変数に書き込むのは、EFI規格上完全に合法な操作であるが、どうやらファームウェアの不具

    yasuyuky
    yasuyuky 2016/02/06
  • Grub2の認証でバックスペースを28回押すとレスキューコンソールに入れる脆弱性が発見された

    Back to 28: Grub2 Authentication Bypass 0-Day Grub2のバージョン1.98(2009年12月)から、2.02(2015年12月)までにおいて、脆弱性が発見された。 脆弱性はGrub2の認証機能を使っていた場合に、ユーザー名を入力すべきところで、バックスペースを28回入力すると、レスキューコンソールに入れてしまうものだ。これにより、コンピューターに物理アクセスを得ている人間が、Grub2の強力なレスキューコンソール機能を使うことができる。 脆弱性の原因も詳しく書かれていて興味深い。grub2のコードでは、'\b'が入力されるたびに、unsigned型の変数をデクリメントする。この時、アンダーフローをチェックしていない。その変数は配列の添字に渡されて、ゼロが書き込まれる。 結果として、関数のreturn addressを0x0にすることができ、関

    yasuyuky
    yasuyuky 2015/12/16
  • C++の例外指定

    C++では、関数に例外指定というものが記述できる。これはC++98からある機能で、throw(T1, T2, ...)という文法で、関数が外に投げる例外を指定する機能だ。 // C++98/03 void f() throw( int, double ) ; もし、関数が例外指定に指定された以外の型を投げた場合、std::unexpectedが呼ばれる。 void f() throw( int ) { throw 0 ; // OK throw 0.0 ; // 実行時エラー: call std::unexpected() } 例外指定は、関数から抜けだせる例外を指定する機能で、関数の外に例外を投げなければ問題がない。 void f() throw( int ) { try { throw 0.0 ; // OK } catch( ... ) { } // OK、外に投げない } というの

    yasuyuky
    yasuyuky 2014/10/19
  • ループカウンタを64bitにしたり、 バッファのサイズを定数にしたらパフォーマンス激落ちなんだけど何で?

    ループカウンタを64bitにしたり、 バッファのサイズを定数にしたらパフォーマンス激落ちなんだけど何で? c++ - Replacing 32bit loop count variable with 64bit introduces crazy performance deviations - Stack Overflow stackoverflowで、興味深い質問が行われている。 簡単にまとめるとこうだ。std::uint64_t型の配列の各要素にx86-64のpopcnt(1になっているビット数を数える命令)を適用したい。 コードの肝心の部分を書くと、以下のようになる。 for (unsigned i=0;i<size/8;i+=4) { count+=_mm_popcnt_u64(buffer[i]); count+=_mm_popcnt_u64(buffer[i+1]); coun

    yasuyuky
    yasuyuky 2014/08/06
    popcntはデータ圧縮や文字列検索のアルゴリズムではよく使われる命令なので覚えておくといいかもしれない
  • rm -rfしちゃったけどどうする

    rm -rf remains rm -rfの後に残りしもの 遊びのために、筆者は新しいLinuxサーバーを立ち上げて、rootでrm -rf /を実行して、何が残るかをみてみた。どうやら、今のrmというのは筆者のようなアホを相手にしなければならない未来に生きているようなので、実際に実行するには、--no-preserve-rootをつける必要があった。 # rm -rf --no-preserve-root / かかるおろかなる行為の後では、 /bin/ls /bin/cat /bin/chmod /usr/bin/file のような、偉大なるツールのたぐいはみな消え失せてしまった。まだ、ssh接続とbashセッションは生きているはずだ。つまり、bashの組み込みコマンドであるechoとかは残っているということだ。 Bashマクガイバーたれ root@rmrf:/# ls -bash: /

    rm -rfしちゃったけどどうする
    yasuyuky
    yasuyuky 2014/06/16
  • もしlambda式がconstexprだったら

    lambda式がconstexprでない理由、いや、より正確には、クロージャーオブジェクトの変換関数がconstexpr関数ではない理由。 もし、constexprの場合は、SFINAEの文脈で使えてしまうからだ。lambda式の体には任意の文を書けるので、以下のような記述が可能だ。 template < typename T, void (*)() = [](){ // write whatever expressions that depends on T. // if any expression is ill-formed for T, substitution fails. } > void f( T ) ; C++11の規格策定の最終段階で、クロージャーオブジェクトの関数ポインターへの変換関数をconstexprにしようという議論がでたが、当時、筆者はこのコードを示して、SF

    yasuyuky
    yasuyuky 2014/06/09
  • 1