This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[gfortran] patch for PR 15294 - ADJUSTR intrinsic accessescorrupted pointer


adjustr was broken.


! pr 15294 - [gfortran] ADJUSTR intrinsic accesses corrupted pointer
!
  program test_adjustr
  implicit none
  integer test_cases
  parameter (test_cases=13)
  integer i
  character(len=10) s1(test_cases), s2(test_cases)
  s1(1)='A'
  s2(1)='         A'
  s1(2)='AB'
  s2(2)='        AB'
  s1(3)='ABC'
  s2(3)='       ABC'
  s1(4)='ABCD'
  s2(4)='      ABCD'
  s1(5)='ABCDE'
  s2(5)='     ABCDE'
  s1(6)='ABCDEF'
  s2(6)='    ABCDEF'
  s1(7)='ABCDEFG'
  s2(7)='   ABCDEFG'
  s1(8)='ABCDEFGH'
  s2(8)='  ABCDEFGH'
  s1(9)='ABCDEFGHI'
  s2(9)=' ABCDEFGHI'
  s1(10)='ABCDEFGHIJ'
  s2(10)='ABCDEFGHIJ'
  s1(11)=''
  s2(11)=''
  s1(12)=' '
  s2(12)=' '
  s1(13)='          '
  s2(13)='          '
  do I = 1,test_cases
!    print*,i
!    print*, 's1          = "', s1(i), '"'
!    print*, 's2          = "', s2(i), '"'
!    print*, 'adjustr(s1) = "', adjustr(s1(i)), '"'
     if (adjustr(s1(i)).ne.s2(i)) then
!        print*,'fail'
         call abort
     endif
  enddo
   
  end program test_adjustr
 

here is the output of the test with prints enabled:


            1
s1          = "A         "
s2          = "         A"
adjustr(s1) = "         A"
           2
s1          = "AB        "
s2          = "        AB"
adjustr(s1) = "        AB"
           3
s1          = "ABC       "
s2          = "       ABC"
adjustr(s1) = "       ABC"
           4
s1          = "ABCD      "
s2          = "      ABCD"
adjustr(s1) = "      ABCD"
           5
s1          = "ABCDE     "
s2          = "     ABCDE"
adjustr(s1) = "     ABCDE"
           6
s1          = "ABCDEF    "
s2          = "    ABCDEF"
adjustr(s1) = "    ABCDEF"
           7
s1          = "ABCDEFG   "
s2          = "   ABCDEFG"
adjustr(s1) = "   ABCDEFG"
           8
s1          = "ABCDEFGH  "
s2          = "  ABCDEFGH"
adjustr(s1) = "  ABCDEFGH"
           9
s1          = "ABCDEFGHI "
s2          = " ABCDEFGHI"
adjustr(s1) = " ABCDEFGHI"
          10
s1          = "ABCDEFGHIJ"
s2          = "ABCDEFGHIJ"
adjustr(s1) = "ABCDEFGHIJ"
          11
s1          = "          "
s2          = "          "
adjustr(s1) = "          "
          12
s1          = "          "
s2          = "          "
adjustr(s1) = "          "
          13
s1          = "          "
s2          = "          "
adjustr(s1) = "          "


no additional testsuite failures, tested i686/gnu/linux FC1


changelog entry:

2004-04-30  Bud Davis  <bdavis9659@comcast.net>

	PR fortran/15294
	* io/intrinsic/string_intrinsics.c(adjustr): rework logic.



--bud





Index: gcc/libgfortran/intrinsics/string_intrinsics.c
===================================================================
RCS file: /cvs/gcc/gcc/libgfortran/intrinsics/Attic/string_intrinsics.c,v
retrieving revision 1.1.2.6
diff -c -3 -p -r1.1.2.6 string_intrinsics.c
*** gcc/libgfortran/intrinsics/string_intrinsics.c      12 Dec 2003 12:48:31 -0000      1.1.2.6
--- gcc/libgfortran/intrinsics/string_intrinsics.c      30 Apr 2004 01:59:48 -0000
*************** adjustr (char *dest, GFC_INTEGER_4 len,
*** 276,287 ****
   
    i = len;
    while (i > 0 && src[i - 1] == ' ')
!     i++;
   
!   if (i < len)
!     memcpy (&dest[len - i], &src, i);
!   if (i < len)
!     memset (dest, ' ', len - i);
  }
   
   
--- 276,286 ----
   
    i = len;
    while (i > 0 && src[i - 1] == ' ')
!     i--;
   
!  if (i<len)
!    memset (dest, ' ', len - i);
!  memcpy (dest + (len - i), src, i );
  }
   
   

 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]