アカウント名:
パスワード:
32bit環境だと仮想メモリ空間は通常2GBまでなので、うっかりメモリポインタを符号付きな変数にキャストしちゃったとか、判定で溢れさせたのかね。
32bit版OSだとOSの設定を変更しないと発覚しないし、64bitネイティブだとこれまたポインタ変数がデカいから平気。WOW64環境下で動く、32bit版でLarge Address Aware対応のアプリが死ぬと。
でも、そんなLarge Address Aware対応してまでメモリを沢山使いたいアプリは64bitにとっとと移行してるから、不具合踏む人は少数派だろうね。32bit自体の古いアプリをずっと使い続けてるとか。
ポインターを返す関数の戻り値の仕様を
としていたAPI開発者のみなさ〜ん、元気ですかー?
正常かどうかの判定をif ( (int)ptr < 0 ) { /* 異常時処理 */ }としていたAPI利用者のみなさ〜ん、生きてますかー?
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 はアウト。
Win32では値が0xFFFF以下ならばグローバルアトムとみなし、0x10000以上ならば文字列へのポインターとみなすという仕様のAPIがたまにあるので、先頭64KB(0x00000000~0x0000FFFF)も予約されている。これは上位16ビットが0x0000(ヌルセレクター)のfarポインターを特別扱いしていたWin16との互換性のため。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
計算機科学者とは、壊れていないものを修理する人々のことである
ポインタ周りをミスったか (スコア:0, 参考になる)
32bit環境だと仮想メモリ空間は通常2GBまでなので、うっかりメモリポインタを符号付きな変数にキャストしちゃったとか、判定で溢れさせたのかね。
32bit版OSだとOSの設定を変更しないと発覚しないし、
64bitネイティブだとこれまたポインタ変数がデカいから平気。
WOW64環境下で動く、32bit版でLarge Address Aware対応のアプリが死ぬと。
でも、そんなLarge Address Aware対応してまでメモリを沢山使いたいアプリは64bitにとっとと移行してるから、不具合踏む人は少数派だろうね。
32bit自体の古いアプリをずっと使い続けてるとか。
Re: (スコア:0)
ポインターを返す関数の戻り値の仕様を
としていたAPI開発者のみなさ〜ん、元気ですかー?
正常かどうかの判定を
if ( (int)ptr < 0 ) { /* 異常時処理 */ }
としていたAPI利用者のみなさ〜ん、生きてますかー?
Re: (スコア:1)
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 はアウト。
Re:ポインタ周りをミスったか (スコア:0)
Win32では値が0xFFFF以下ならばグローバルアトムとみなし、0x10000以上ならば文字列へのポインターとみなすという仕様のAPIがたまにあるので、先頭64KB(0x00000000~0x0000FFFF)も予約されている。これは上位16ビットが0x0000(ヌルセレクター)のfarポインターを特別扱いしていたWin16との互換性のため。