パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

もうやらなくていい昔のコーディングテクニックあれこれ」記事へのコメント

  • 私の場合 (スコア:2, 興味深い)

    by L.Entis (21733) on 2009年05月04日 14時23分 (#1559013) ホームページ 日記
    自己書き換えコードかな…

    586以降では命令キャッシュを破壊したりと不利益のほうが大きいので使う事はなくなりましたね、さすがに。
    • by yyyyyyyy (37036) on 2009年05月04日 14時53分 (#1559025)
      そんなふうに考えていた時期が 俺にもありました、とAAを貼りたくなりますが、最近復権しているテクニックですね。
      親コメント
      • 最近復権しているテクニックですね。

        リバースエンジニアリング対策としては一定の効果があるのでしょうが、何某かのOS上で動くコードでそれをやるのは危険ではないですか?やってる事自体はバッファオーバフロー攻撃とあんまし変わらない訳で(バッファオーバフローはスタック領域とコード領域の間のプロテクションの曖昧性を突いて強引に自己書き換えするので意味合いが違いますけど)

        # セグメント種別にうるさい86系で自己書き換えをやって安定して動かせられる状況と言うのが今ひとつ
        # 実感出来ないのもありますが。これがMMUをキャンセルしてシングルタスク同然で動かしてるRISCとか
        # RAMにコード展開するマイコン装置ならまだ理解できますが…

        親コメント
        • キャッシュ導入以前の 80x86 は命令プリフェッチが存在し、 しかも CPU の種類によってプリフェッチ幅が異なっていたので、 実行中の命令の少し先を自己書き換えすると「V30 では動くが 80286 では動かない」という 不安定な動作をしていた記憶があります。

          それが i486 のキャッシュ導入以降はかえってフレンドリーな動作になり、 Pentium に至ってはすでにパイプラインに入った命令が自己書き換えを受けた場合、 パイプラインを自動的に巻き戻してくれていました。
          # P6 系から自己書き換えは再び面倒になったはず。

          ところで x86 系 CPU で Self-Modifying Code や Cross-Modifying Code を行なう正しい作法は、 Intel64 and IA-32 Architectures Software Developer's Manual Volume 3A: System Programming Guide [intel.com] の 7.1.3 Handling Sef- and Cross-Modifying Code の章に記述されていますよ。
          この作法を守って正しく動作しない場合は CPU のバグですな。
          --
          コンタミは発見の母
          親コメント
          • by Anonymous Coward
            > # P6 系から自己書き換えは再び面倒になったはず。

            マニュアルには自己書き換えの後に明示的なジャンプかシリアライズが必要とあります。
            確かにOoOプロセッサでこんなものまで巻き戻すのは泣けてきそうです。
        • 今風のはもちろん危険なことをするわけではなく、JITコンパイラやそれに類することです。
          コードテンプレートに処理を埋め込むとか、動的に生成したコードについて追加処理をインクリメンタルに埋め込む、あるいはより最適化した処理に置き換えるとか。
          親コメント
    • Re:私の場合 (スコア:1, 興味深い)

      by Anonymous Coward on 2009年05月04日 15時02分 (#1559029)
      EX 0,*を書くのは便利だったんだけどな。これは自己書き換えコードじゃないね。

      かってにABEND 0C3してきます...
      親コメント
    • by shiroiwanisan (12855) on 2009年05月05日 8時00分 (#1559391) 日記
      昔、bitに載っていた問題ですね。
      「汎用的に使える、自己変換コードを書け」

      ヒント、system()って知ってる?
      親コメント
    • by Anonymous Coward
      486以降やめました

人生unstable -- あるハッカー

処理中...