mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-13 15:31:15 +08:00
analyzer: gfortran testsuite support
This patch adds a gfortran.dg/analyzer subdirectory with an analyzer.exp, setting DEFAULT_FFLAGS on the tests run within it. It also adds a couple of simple proof-of-concept tests of e.g. detecting double-frees from gfortran. gcc/testsuite/ChangeLog: * gfortran.dg/analyzer/analyzer.exp: New subdirectory and .exp suite. * gfortran.dg/analyzer/malloc-example.f90: New test. * gfortran.dg/analyzer/malloc.f90: New test.
This commit is contained in:
parent
7214fce302
commit
e9fb7579cb
gcc/testsuite
@ -1,3 +1,10 @@
|
||||
2020-02-10 David Malcolm <dmalcolm@redhat.com>
|
||||
|
||||
* gfortran.dg/analyzer/analyzer.exp: New subdirectory and .exp
|
||||
suite.
|
||||
* gfortran.dg/analyzer/malloc-example.f90: New test.
|
||||
* gfortran.dg/analyzer/malloc.f90: New test.
|
||||
|
||||
2020-02-10 Martin Sebor <msebor@redhat.com>
|
||||
|
||||
PR c/93640
|
||||
|
55
gcc/testsuite/gfortran.dg/analyzer/analyzer.exp
Normal file
55
gcc/testsuite/gfortran.dg/analyzer/analyzer.exp
Normal file
@ -0,0 +1,55 @@
|
||||
# Copyright (C) 2020 Free Software Foundation, Inc.
|
||||
|
||||
# This file is part of GCC.
|
||||
#
|
||||
# GCC is free software; you can redistribute it and/or modify it under
|
||||
# the terms of the GNU General Public License as published by the Free
|
||||
# Software Foundation; either version 3, or (at your option) any later
|
||||
# version.
|
||||
#
|
||||
# GCC is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
# WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
# for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with GCC; see the file COPYING3. If not see
|
||||
# <http://www.gnu.org/licenses/>.
|
||||
|
||||
# GCC testsuite that uses the `dg.exp' driver.
|
||||
|
||||
# Load support procs.
|
||||
load_lib gfortran-dg.exp
|
||||
load_lib gfortran.exp
|
||||
|
||||
# If the analyzer has not been enabled, bail.
|
||||
if { ![check_effective_target_analyzer] } {
|
||||
return
|
||||
}
|
||||
|
||||
global DEFAULT_FFLAGS
|
||||
if [info exists DEFAULT_FFLAGS] then {
|
||||
set save_default_fflags $DEFAULT_FFLAGS
|
||||
}
|
||||
|
||||
# If a testcase doesn't have special options, use these.
|
||||
set DEFAULT_FFLAGS "-fanalyzer -fdiagnostics-path-format=separate-events -Wanalyzer-too-complex -fanalyzer-call-summaries"
|
||||
|
||||
# Initialize `dg'.
|
||||
dg-init
|
||||
|
||||
# Main loop.
|
||||
|
||||
gfortran_init
|
||||
|
||||
gfortran-dg-runtest [lsort \
|
||||
[glob -nocomplain $srcdir/$subdir/*.\[fF\]{,90,95,03,08} ] ] "" $DEFAULT_FFLAGS
|
||||
|
||||
# All done.
|
||||
dg-finish
|
||||
|
||||
if [info exists save_default_fflags] {
|
||||
set DEFAULT_FFLAGS $save_default_fflags
|
||||
} else {
|
||||
unset DEFAULT_FFLAGS
|
||||
}
|
21
gcc/testsuite/gfortran.dg/analyzer/malloc-example.f90
Normal file
21
gcc/testsuite/gfortran.dg/analyzer/malloc-example.f90
Normal file
@ -0,0 +1,21 @@
|
||||
! Example from GCC documentation
|
||||
! { dg-do compile }
|
||||
! { dg-additional-options "-fcray-pointer" }
|
||||
|
||||
program test_malloc
|
||||
implicit none
|
||||
integer i
|
||||
real*8 x(*), z
|
||||
pointer(ptr_x,x)
|
||||
|
||||
ptr_x = malloc(20*8)
|
||||
do i = 1, 20
|
||||
x(i) = sqrt(1.0d0 / i)
|
||||
end do
|
||||
z = 0
|
||||
do i = 1, 20
|
||||
z = z + x(i)
|
||||
print *, z
|
||||
end do
|
||||
call free(ptr_x)
|
||||
end program test_malloc
|
19
gcc/testsuite/gfortran.dg/analyzer/malloc.f90
Normal file
19
gcc/testsuite/gfortran.dg/analyzer/malloc.f90
Normal file
@ -0,0 +1,19 @@
|
||||
! { dg-do compile }
|
||||
! { dg-additional-options "-fcray-pointer -O0" }
|
||||
|
||||
subroutine test_ok
|
||||
real*8 x(*)
|
||||
pointer(ptr_x,x)
|
||||
|
||||
ptr_x = malloc(20*8)
|
||||
call free(ptr_x)
|
||||
end subroutine test_ok ! { dg-bogus "leak" }
|
||||
|
||||
subroutine test_double_free
|
||||
real*8 x(*)
|
||||
pointer(ptr_x,x)
|
||||
|
||||
ptr_x = malloc(20*8)
|
||||
call free(ptr_x)
|
||||
call free(ptr_x) ! { dg-warning "double-'free'" }
|
||||
end subroutine test_double_free ! { dg-bogus "leak" }
|
Loading…
x
Reference in New Issue
Block a user