Argument validity checking (addresses)
Ariel Faigon
arielf at taux01.UUCP
Sun Feb 4 19:13:52 AEST 1990
In <1990Jan26.003654.6080 at NCoast.ORG> Brandon S. Allbery writes:
| As quoted from <1891 at gmdzi.UUCP> by wittig at gmdzi.UUCP (Georg Wittig):
| +---------------
| | My solution is the following one:
| |
| | #define MIN_NON_NIL_PTR ((unsigned long) 1L)
| | #define MAX_NON_NIL_PTR ((unsigned long) 0x00ffffffL)
| +---------------
|
I liked Brandon's original suggestion (to pass the address to some
system-call which checks for EFAULT).
Anyway, without claiming that the following solution is portable/general/
whatever I'll post my contribution to this thread,
just because on some systems it may be a bit better than Georg's solution
(although basically the same idea).
Quoted from some derivative of a 4.x BSD manual on end(3):
NAME
end, etext, edata - last locations in program
SYNOPSIS
extern end;
extern etext;
extern edata;
So (I add 'start' which may be defined in your C startup module):
#define IN_MY_TEXT(addr) ((void *) &start <= (addr) < (void *) &etext)
#define IN_MY_DATA(addr) (!(IN_MY_TEXT(addr) && (addr) < (void *) &end)
#define IN_MY_HEAP(addr) ((void *) &end <= (addr) < (void *) sbrk(0))
#define IN_MY_ADDRESS_SPACE(addr) \
(IN_MY_TEXT(addr) || IN_MY_DATA(addr) || IN_MY_HEAP(addr))
(disclaimer: this code wasn't tested).
This still doesn't handle gaps, shared memory segments, and stack space
you can check (again, not bullet-proof) for an address near the top of
your stack by comparing 'addr' to some local variable address.
Just another approximation for the truth :-)
--
Ariel Faigon, CTP group, NSTA
National Semiconductor (Israel)
6 Maskit st. P.O.B. 3007, Herzlia 46104, Israel Tel. (972)52-522312
arielf%taux01 at nsc.com @{hplabs,pyramid,sun,decwrl} 34 48 E / 32 10 N
More information about the Comp.lang.c
mailing list