Previous | Contents | Index |
KAP users should be aware that KAP assumes that the Fortran 90 code that it processes conforms to the Fortran 90 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 Compaq 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 90 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 Compaq 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.
Previous | Next | Contents | Index |