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

一部の 32 ビット Windows アプリでファイルのコピーや保存が断続的に失敗する問題」記事へのコメント

  • by Anonymous Coward

    32bit環境だと仮想メモリ空間は通常2GBまでなので、うっかりメモリポインタを符号付きな変数にキャストしちゃったとか、判定で溢れさせたのかね。

    32bit版OSだとOSの設定を変更しないと発覚しないし、
    64bitネイティブだとこれまたポインタ変数がデカいから平気。
    WOW64環境下で動く、32bit版でLarge Address Aware対応のアプリが死ぬと。

    でも、そんなLarge Address Aware対応してまでメモリを沢山使いたいアプリは64bitにとっとと移行してるから、不具合踏む人は少数派だろうね。
    32bit自体の古いアプリをずっと使い続けてるとか。

    • by Anonymous Coward

      ポインターを返す関数の戻り値の仕様を

      • 0<: 正常
      • -1: 警告
      • -2: 異常

      としていたAPI開発者のみなさ〜ん、元気ですかー?

      正常かどうかの判定を
      if ( (int)ptr < 0 ) { /* 異常時処理 */ }
      としていたAPI利用者のみなさ〜ん、生きてますかー?

      • by Anonymous Coward

        64ビット版WindowsでのLarge Address Awareな32ビットプロセスでも、0xFFFF0000~0xFFFFFFFFは予約されていてアプリから使えないみたい。

        https://stackoverflow.com/a/48081399 [stackoverflow.com]
        https://www.marbacka.net/blog/64bit_addressing/ [marbacka.net]

        だから-1と-2を返すのはセーフ。もちろんif ( (int)ptr はアウト。

        • by Anonymous Coward

          32bit版Windows以外の幾つかの32bit版Unix系OSもサポート対象だったけど、それらも含めて0xFF…FFや0xFF…FEをアプリに返すOSは無いでしょうね。
          なので、API利用者側だった自分は取り敢えず
          if ( (ptr == (Foo *)-2) || (ptr == (Foo *)-1) ) { /* 異常時処理 */ }

          とかしといた。

          この仕様に慣らされて、
          FILE *fp = fopen(…);
          if ( (int)fp < 0 ) { /* 異常時処理 */ }

          とか通常の32bitアプリでも動かない(OSのある)コードを書いてた奴は、生きてるかな?

吾輩はリファレンスである。名前はまだ無い -- perlの中の人

処理中...