指定されたポインタが有効かどうかを判断する移植可能な方法はありません。扱っているメモリシステムの種類を知る必要があります。オペレーティング システムとプロセッサによっては、仮想メモリ マネージャーのページ テーブルを照会してポインターの有効な範囲を判断する方法がある場合とない場合があります。
たとえば、Linux では、mmap
下にある特殊ファイルを調べて/proc
、プロセスの仮想メモリ マップを取得できます。cat
独自のメモリ マップを読み取る例を次に示します。
$ 猫 /proc/self/mmap
08048000-0804c000 r-xp 00000000 09:00 5128276 /ビン/猫
0804c000-0804d000 rw-p 00003000 09:00 5128276 /ビン/猫
0804d000-0806e000 rw-p 0804d000 00:00 0 [ヒープ]
f7ca7000-f7e40000 r--p 00000000 09:00 3409654 /usr/lib/locale/locale-archive
f7e40000-f7e41000 rw-p f7e40000 00:00 0
f7e41000-f7f68000 r-xp 00000000 09:00 2654292 /lib/tls/i686/cmov/libc-2.3.6.so
f7f68000-f7f6d000 r--p 00127000 09:00 2654292 /lib/tls/i686/cmov/libc-2.3.6.so
f7f6d000-f7f6f000 rw-p 0012c000 09:00 2654292 /lib/tls/i686/cmov/libc-2.3.6.so
f7f6f000-f7f72000 rw-p f7f6f000 00:00 0
f7f83000-f7f85000 rw-p f7f83000 00:00 0
f7f85000-f7f9a000 r-xp 00000000 09:00 2637871 /lib/ld-2.3.6.so
f7f9a000-f7f9c000 rw-p 00014000 09:00 2637871 /lib/ld-2.3.6.so
ff821000-ff836000 rw-p 7ffffffea000 00:00 0 [スタック]
ffffe000-fffff000 r-xp ffffe000 00:00 0 [vdso]
メモリが (r)readable、(w)ritable、e(x)ecutable、または (p)resent (つまり、ディスクにページアウトされていない) かどうかを示すビットと共に、有効なポインターの範囲を確認できます。