_REENT_SMALL IO broken

Jeff Johnston jjohnstn@redhat.com
Tue Sep 26 18:06:00 GMT 2006


Paul Brook wrote:
>>>a) Every use of a file descriptor needs to check if it has the read FD,
>>>or a dummy copy. In this case there's no point having the dummy
>>>structure, we can just assign stdin/out/err magic values. As a bonus
>>>_reent gets even smaller, at the expense of a small code size increase.
> 
> 
>>IMO, the right solution is a) but not the 2nd part of your proposal.
>>The reason we have the dummy structure is to handle the stdio macros
>>(e.g. getc and putc).  For speed/compactness, we want them to think they
>>are operating on a real FILE * and we set the values such that we always
>>force a function call to occur based on their regular logic path.
> 
> 
> I guess this is the only way to do it without slowing down the !_REENT_SMALL 
> case. However consider:
> 
> #include <stdio.h>
> int main()
> {
>   FILE *foo = stdout;
>   fprintf(foo, "Hello World\n");
>   if (foo != stdout)
>     abort();
>   return 0;
> }
> 
> I find it surprising for this program to abort.
> 

_REENT_SMALL was specifically added for embedded platforms that are 
extremely tight on storage (some verging on crippled IMO).  It should 
not be used by platforms that just want to save a few bytes.  It is not 
surprising that these platforms can't do everything in a Standard's test 
bucket (some of them don't even do file I/O).  Storing away the standard 
streams isn't something any reasonable program other than a concocted 
standard-test is going to do.  It certainly won't be found in real code 
written for such platforms.

I'll start working on the fix.

> There are also more subtle bugs that can occur when using the dummy FILE* with 
> the feof, ferror, and clearerr macros.
> 

These macros should be ok.  You shouldn't be at EOF since you haven't 
issued any read and you haven't caused any error to occur prior to the 
first reference.

-- Jeff J.



More information about the Newlib mailing list