[petsc-dev] Need help with Fortran code/compiler issue

Lawrence Mitchell lawrence.mitchell at imperial.ac.uk
Fri Apr 8 03:23:24 CDT 2016


> On 7 Apr 2016, at 19:46, Barry Smith <bsmith at mcs.anl.gov> wrote:
> 
> 
> src/sys/classes/bag/f2003-src/fsrc/bagenum.F has the code fragment
> 
>     Subroutine PetscBagRegisterEnum(bag,addr,FArray,def,n,h,ierr)
>      use,intrinsic :: iso_c_binding
>      implicit none
> 
>      PetscBag   bag
>      character(*)                n,h
>      character(*)                FArray(*)
>      PetscEnum                   :: def
>      PetscErrorCode,intent(out)  :: ierr
>      PetscReal addr(*)
> 
>      Type(C_Ptr),Dimension(:),Pointer :: CArray
>      character(kind=c_char),pointer   :: nullc => null()
>      PetscInt   :: i,Len
>      Character(kind=C_char,len=256),Dimension(:),Pointer::list1
> 
>      do i=1,256
>        if (len_trim(Farray(i)) .eq. 0) then
>          Len = i-1
>          goto 100
>        endif
>        if (len_trim(Farray(i)) .gt. 255) then
>          ierr = PETSC_ERR_ARG_OUTOFRANGE
>          return
>        endif
>      enddo
>      ierr = PETSC_ERR_ARG_OUTOFRANGE
>      return
> 
> 100  continue
> 
>      Allocate(list1(Len),stat=ierr);
>      Allocate(CArray(Len+1),stat=ierr)
>      do i=1,Len
>         list1(i) = trim(FArray(i))//C_NULL_CHAR
>      enddo
> 
>      CArray = (/(c_loc(list1(i)),i=1,Len),c_loc(nullc)/)
>      call PetscBagRegisterEnumPrivate(bag,addr,CArray,def,n,h,ierr)
>      DeAllocate(CArray)
>      DeAllocate(list1)
>      End Subroutine
> 
> which produces the following warning with one Fortran compiler:
> 
> /Users/petsc/petsc.clone-4/src/sys/objects/f2003-src/fsrc/optionenum.F:35:0:
> 
>       CArray = (/(c_loc(list1(i)),i=1,Len),c_loc(nullc)/)
> ^
> Warning: 'list1.data' may be used uninitialized in this function [-Wmaybe-uninitialized]
> 
>  Do any Fortran programmers know if the code is correct or if this is an incorrect warning from the compiler?


This is occurring because the return value from allocate(list1(Len),stat=ierr) is not being checked and so list1 may be NULL later on.

This squashes the warning for me:

Allocate(list1(Len),stat=ierr)
if (ierr .ne. 0) then
    ierr = PETSC_ERR_MEM
    return
endif

One should presumably do the same after the allocation of CArray as well.

It looks like the same change would apply in optionenum.F
Cheers,

Lawrence
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 455 bytes
Desc: Message signed with OpenPGP using GPGMail
URL: <http://lists.mcs.anl.gov/pipermail/petsc-dev/attachments/20160408/2cc6f196/attachment.sig>


More information about the petsc-dev mailing list