------- Comment #7 from pcarlini at suse dot de  2007-03-12 19:51 -------
(In reply to comment #6)
> > Anyway, what happens in the GNU systems is that errno is a per-thread 
> > variable
> > and the __convert_to_v code has to do nothing special, just safely use it.
> 
> I agree. The problem is that this is not happening. __convert_to_v is not
> safely using the per-thread errno. Instead, it is using the global errno.

To be clear, *not* on Linux, right? Because in your report you said Linux and
MacOSX were fine, and that is consistent with my expectations. Indeed, reading
the glibc errno.h it is clear that errno is per-thread.

> The cause is not the __convert_to_v code but something in an include file or a
> gcc option which causes the code to be compiled incorrectly. Yet another file
> in the same library compiled with the same gcc options does access the
> thread-safe errno correctly. That a discrepancy exists indicates a problem
> somewhere.

I have no idea, frankly. Certainly all the sources are compiled with the same
options.

An idea I just had is that maybe we could try to avoid errno completely, at
least in the generic locale model: we could simply check whether the functions
return HUGE_VAL & co. That would mean we can't detect anymore underflows, but
that errno is set on underflows is implementation dependent and, anyway, the
C++ standard mandates that the behavior should be as-if the library used scanf,
which has no notion of underflow. Maybe you can try the change yourself, and
modify __convert_to_v (say the simple one, for double) to check, instead of
errno != ERANGE, d != HUGE_VAL && d != -HUGE_VAL??

One final note: in the forthcoming C++0x standard things will be more tricky
because the C++ library will be able to parse +INF & co, but we should be able
to manage anyway, because we can first detect those and only otherwise, hands
the string to strtod, which then will return HUGE_VAL / -HUGE_VAL only in case
of real overflow (not input of +INF / -INF).


-- 

pcarlini at suse dot de changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |WAITING


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31117

Reply via email to