[prev in list] [next in list] [prev in thread] [next in thread] 

List:       gcc-bugs
Subject:    [Bug libfortran/54736] GFORTRAN_CONVERT_UNIT causes malloc error on several platforms
From:       "shart6 at utk dot edu" <gcc-bugzilla () gcc ! gnu ! org>
Date:       2012-09-30 20:56:39
Message-ID: bug-54736-4-VVkaj6WYRK () http ! gcc ! gnu ! org/bugzilla/
[Download RAW message or body]


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

--- Comment #5 from Shane Hart <shart6 at utk dot edu> 2012-09-30 20:56:39 UTC ---
(In reply to comment #4)
> Am 30.09.2012 21:12, schrieb shart6 at utk dot edu:
> > If n_elist = 1, then high = low = 0, and the funtion will always return 0, even
> > if the unit passed in to search for is in the exception list.
> 
> If there are n_elist exceptions, then they can be found in
> elist[0], ..., elist[n_elist-1].
> 
> If there is one exception, then it can be found at elist[0].

That is true, but the function will not return 1 (true, a match was found in
elist) when there is only one exception stored.  It will skip over the while
loop, set *ip to 0, and return 0 (false, the exception was not found!).

This can be illustrated:

1) Call the program, setting only one exception (in this case unit 21):

[shane@shane-laptop ~/temp/testgfortran]$
GFORTRAN_CONVERT_UNIT='native;big_endian:21' gnu_wrap gdb ./test_read

2) Set a break point at where the library enquires as to the endianness of the
file to be opened:

Breakpoint 1, _gfortrani_get_unformatted_convert (unit=21) at
../../../libgfortran/runtime/environ.c:848

3) We will step into search_unit (with unit = 21).  Everything is great.
however, since n_elist = 1, high = low = 0, and the while loop is skipped over:

(gdb) step
471       while (high - low > 1)
(gdb) step
485       if (unit > elist[high].unit)

4) And 0 is returned (unit exception not found!)

(gdb) step
490       return 0;

5) The library is told to open unit 21 (which is in the exception list at 0) as
default endianness:

_gfortrani_get_unformatted_convert (unit=21) at
../../../libgfortran/runtime/environ.c:856
856         return def;
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic