KAP users should be aware that KAP assumes that the Fortran code that it processes conforms to the Fortran rules. Programs that violate these rules may behave differently after KAP transforms it.
As an example, the following is a program in which the loop control variable is modified during execution of the loop:
DIMENSION A(200) COMMON I J = 10 K = 100 L = 10 DO I=J,K,L A(I) = I CALL SETI ENDDO WRITE (6,*) I,A(I) END SUBROUTINE SETI COMMON I I = 20 END
The output of this program is as follows:
30 30.00000
When the Fortran compiler does not know the value of the "increment"
parameter of a DO loop, it always computes a loop iteration count,
even if the value is subsequently determined by value propagation.
Thus, if the program illegally modifies the loop control variable
I
, the loop will still complete in the correct number
of iterations. In this case, no compilation time or run-time error
message is given, even though the program violates the Fortran 77
standard and the Fortran language rules.
KAP produces the following when this program is processed:
DIMENSION A(200) COMMON I DO I=10,100,10 A(I) = I CALL SETI END DO WRITE (6, *) I, A(I) END SUBROUTINE SETI COMMON I I = 20 END
This program incurs an access violation at run time. Because the
Fortran compiler sees that the increment value is a constant, it
uses I
directly to test for loop termination. Because
I
is modified in the loop just before the test, the
loop does not terminate, but at the top of the loop I
is given a new value appropriate for the iteration number the
loop has reached. Eventually I
exceeds 200 and the
assignment statement accesses past A(200)
, resulting
in the access violation.
A wide variety of incorrect behaviors can result from KAP transformations with "illegal" programs. This possibility (and others of like nature) will need to be considered when evaluating programs whose run-time behavior changes when KAP is used.
Copyright © Digital Equipment Corporation. 1999. All Rights Reserved.