tech-kern archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: NULL pointer arithmetic issues
On 2020-02-25 12:33, Tom Ivar Helbekkmo wrote:
Johnny Billquist <bqt%softjar.se@localhost> writes:
But yes, on the PDP11 [having nothing mapped at address 0] was/is not
the case. Memory space is too precious to allow some of it to be
wasted for this...
Yup - and I assume the "hack" Kamil alludes to is the practice of
actually starting the data segment for split I/D programs at address 1
instead of 0, to make sure that no actual pointer is 0, thus allowing
the straightforward comparison of a pointer with 0 to see if it's set.
Well, the d-dpace don't start at 1, and also, the PDP-11 isn't that fond
of odd addresses. :-)
Actually, you could not even start a page at address 1 if you wanted.
(I believe they also initialized address 0 to 0, to stop indirect
references through it from reaching random data. I guess Franz may have
depended on this in some way, e.g. expecting to be able to test *p
directly, instead of first p and then *p. Do enough of this, and you've
soon bummed a significant amount of valuable code space...)
It used to, but not for some time now.
Here is the current "state":
/*
* Paragraph below retained for historical purposes.
*
* The following zero has a number of purposes - it serves as a null
terminated
* string for uninitialized string pointers on separate I&D machines for
* instance. But we never would have put it here for that reason; programs
* which use uninitialized pointer *should* die. The real reason it's
here is
* so you can declare "char blah[] = "foobar" at the start of a C program
* and not have printf generate "(null)" when you try to print it because
* blah is at address zero on separate I&D machines ... sick, sick,
sick ...
*
* In porting bits and pieces of the 4.4-Lite C library the global program
* name location '___progname' was needed. Rather than take up another two
* bytes of D space the 0th location was used. The '(null)' string was
* removed from doprnt.s so now when programs use uninitialized pointers
* they will be rewarded with argv[0]. This is no sicker than before and
* may cause bad programs to die sooner.
*/
.data
.globl ___progname, _strrchr
___progname: 0
Johnny
--
Johnny Billquist || "I'm on a bus
|| on a psychedelic trip
email: bqt%softjar.se@localhost || Reading murder books
pdp is alive! || tryin' to stay hip" - B. Idol
Home |
Main Index |
Thread Index |
Old Index