_REENT_SMALL IO broken
Jeff Johnston
jjohnstn@redhat.com
Tue Sep 26 21:23:00 GMT 2006
Attached is the patch I have been testing. It seems to do the trick.
If you want to test it out a bit further, let me know, otherwise, I'll
commit it.
BTW: you were right about the feof, clearerr, and ferror macros. I
changed stdio.h to force them to be functions.
-- Jeff J.
Jeff Johnston wrote:
> Paul Brook wrote:
>
>>> _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.
>>
>>
>>
>> My interest here is for armv7. This covers everything from tiny
>> microcontrollers with only 2k ram to large SoC systems many megabytes
>> of memory. It'd be nice to be able to use the same library for both.
>>
>> Comparing a file pointer to stdin does occur in real code. For example
>> gdb contains several instances of "if (instream == stdin)".
>>
>
> Granted, but gdb is not going to run on a _REENT_SMALL platform and such
> a problem is solved by adding a first reference (e.g. fflush(stdin)).
> _REENT_SMALL platform code makes concessions as needed. I think the
> answer in this situation is to add another macro to control whether the
> FILE structs are found in the small reent struct or not (default no).
> This will solve your problem and won't interfere with existing
> _REENT_SMALL builds.
>
>>
>>>> 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.
>>
>>
>>
>> The user could still be using the old value via a cached pointer, as
>> in my previous example or more commonly by stdout being passed as a
>> function argument. This is definitely fairly common practice. eg:
>>
>> void frob(FILE *f)
>> {
>> while (!feof(f))
>> fgetc(f);
>> }
>> int main()
>> {
>> frob(stdin);
>> return 0;
>> }
>>
>> It's arguable whether it's ok to change the value of stdin, but if it
>> does change then the old pointer must continue to function correctly.
>>
>
> Yes, you are right. I have incorporated this feature into my patch
> which I am currently testing.
>
> -- Jeff J.
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: small_reent.patch
Type: text/x-patch
Size: 22289 bytes
Desc: not available
URL: <http://sourceware.org/pipermail/newlib/attachments/20060926/3a2859c1/attachment.bin>
More information about the Newlib
mailing list