This is becoming annoying the amount of posts to try and describe the behaviour of headers
Headers appear first in the data sent to the user's browser
if headers have been called using the header() function but no data has been sent to the output buffer (using echo, readfile etc), then the headers are sent at the end of script execution otherwise they are sent when the buffer reaches it's limit and emptied
simple
this means that headers_sent() will return false if nothing is sent to the output buffer because the headers are being sent at the end of the script
This is not a bug either, this is expected behaviour. Keeping headers until forced to send them out is a good idea because certain measures can be taken like prevention of meta injection etc (option in header() to replace headers that have not yet been sent)
besides, headers_sent() is good for when you try and send headers but the output buffer has already been emptied (in cases of php error handling for example). Obviously if the buffer has emtpied, sending headers won't work.