Hi Krishna,

On 03.04.21 13:52, Krishna Kariya wrote:
I am Krishna, a final-year undergraduate student from India. I am
interested in the project “Fortran – run-time argument checking” for
GSoC 2021. Please share some resources about the project. Please point
to some issues or programming tasks that I can try out to understand
the project better.

In older Fortran program, no modules were used and, hence, no argument
checking was possible. Think of:

subroutine caller()
  external callee
  integer :: A(5), b(4)
  call callee(A, B, 5.0, "Hello")
end

Here, the compiler only knows that 'callee' is a subroutine but has no
idea about the actual arguments. Alternatively, in semi-modern code, it
could use:

subroutine caller()
  integer :: A(5), b(4)
  interface
    subroutine callee(w,x,y,z)
      integer :: w(*), x(*)
      real :: y
      character(*) :: z
    end
  end interface
  call callee(A, B, 5.0, "Hello")
end

The idea is that the caller now fills global variables:
  __gfortran_called_proc = callee  ! function pointer
  __gfortran_called_interface = ... pointer to a struct/derived type
and afterwards, it would set both to null.

The latter contains then:
- a version number (to be able to add more data later on)
- file name, function name and line number of the caller
- information about the arguments:
- 4 arguments
- first: integer array of size 4
- ...

And in
  subroutine callee(....)
it would check:
  if (__gfortran_called_proc == callee)
and then fill a similar struct with similar data
(version number, filename, proc name, line number, arguments)
and then call the library function
 __libgfortran_check_args(
   __gfortran_called_interface,
   callee_interface);
which then checks whether the arguments match.

Internal procedures and module procedures can be excluded as
those can not be access from the outside.

Minimal check would be:
- number of arguments
- data type
- array + array size
- caller/callee is a function – and expected return values (type, array)
but that can be extended especially in the context of an interface block
(with a zoo of attributes, additional array types etc.) and with intent
handling (intent(out) in caller but constant or intent(in) as argument,
intent(out) argument to intent(in) etc.)

Tobias

-----------------
Mentor Graphics (Deutschland) GmbH, Arnulfstrasse 201, 80634 München 
Registergericht München HRB 106955, Geschäftsführer: Thomas Heurung, Frank 
Thürauf

Reply via email to