News for hackers. Stuff that matters.
Re:Xcode 4 ships a buggy compiler by xyzzyz on Friday December 30, 2011 @10:31PM (#3410045)
Pointers you get from malloc() usually have metadata alongside too, you're just not supposed to read it.
Re:Xcode 4 ships a buggy compiler by mikeash on Friday December 30, 2011 @10:55PM (#3410092)
On many systems, malloc(0) returns NULL. I recall one man page describing it as "a stupid answer to a stupid question" or some such.
Re:Xcode 4 ships a buggy compiler by tptacek on Friday December 30, 2011 @11:03PM (#3410113)
Which, it's not remotely a stupid question: malloc gets passed a zero-length argument when it's used to allocate variable length data. That malloc(0) works and is handled by free() without crashing the program is a simplifying assumption, as is the assumption that free(NULL) won't corrupt the heap.

Any use of alloca() on the other hand seems risky. Similar arguments could be made about the semantics of jmp_bufs, which also get used to get a handle on the stack.

Re:Xcode 4 ships a buggy compiler by mikeash on Saturday December 31, 2011 @10:14AM (#3410995)
"the assumption that free(NULL) won't corrupt the heap."

That's not an assumption, that's how the free() function is defined to work by the language standard. It never ceases to astound me how many otherwise good C programmers think free(NULL) is an error.

Re:Xcode 4 ships a buggy compiler by tptacek on Saturday December 31, 2011 @10:58AM (#3411106)
... yes, that's what I'm saying.
Re:Xcode 4 ships a buggy compiler by mikeash on Saturday December 31, 2011 @11:04AM (#3411116)
I see. The word "assumption" confused me, as in context it would generally mean something that isn't necessarily true.
Re:Xcode 4 ships a buggy compiler by nitrogen on Saturday December 31, 2011 @03:45AM (#3410500)
as is the assumption that free(NULL) won't corrupt the heap.

When you refer to simplifying assumptions, are you talking about assumptions made by the programmer, or by the compiler and libc? For example, the POSIX manual page[0] for free( void* ptr ) says, "If ptr is a null pointer, no action shall occur." The malloc manpage says, "If size is 0, either a null pointer or a unique pointer that can successfully passed to free() shall be returned." That sounds more like a definition than an assumption to me. What am I missing?

[0] Obtained by installing manpages-posix-dev on Ubuntu and running man 3posix free.