From 34e045d01dcd5d149f6ec2a26da61aaf9556e33d Mon Sep 17 00:00:00 2001 From: julie Date: Sat, 13 Nov 2010 15:50:45 +0000 Subject: [PATCH] Correct memory access in CSD found with -fbounds-check flag --- SRC/cbbcsd.f | 29 +++++++++++++++++++---------- SRC/dbbcsd.f | 29 +++++++++++++++++++---------- SRC/sbbcsd.f | 29 +++++++++++++++++++---------- SRC/zbbcsd.f | 29 +++++++++++++++++++---------- TESTING/EIG/ccsdts.f | 6 ++++-- TESTING/EIG/dcsdts.f | 6 ++++-- TESTING/EIG/scsdts.f | 6 ++++-- TESTING/EIG/zcsdts.f | 6 ++++-- 8 files changed, 92 insertions(+), 48 deletions(-) diff --git a/SRC/cbbcsd.f b/SRC/cbbcsd.f index 83ea870..d5d2210 100644 --- a/SRC/cbbcsd.f +++ b/SRC/cbbcsd.f @@ -316,13 +316,16 @@ * Initial deflation * IMAX = Q - DO WHILE( ( IMAX .GT. 1 ) .AND. ( PHI(IMAX-1) .EQ. 0 ) ) + DO WHILE( ( IMAX .GT. 1 ) .AND. ( PHI(IMAX-1) .EQ. ZERO ) ) IMAX = IMAX - 1 END DO IMIN = IMAX - 1 - DO WHILE( ( IMIN .GT. 1 ) .AND. ( PHI(IMIN-1) .NE. 0 ) ) - IMIN = IMIN - 1 - END DO + IF ( IMIN .GT. 1 ) THEN + DO WHILE( PHI(IMIN-1) .NE. ZERO ) + IMIN = IMIN - 1 + IF ( IMIN .LE. 1 ) EXIT + END DO + END IF * * Initialize iteration counter * @@ -852,14 +855,20 @@ * * Deflate * - DO WHILE( (IMAX .GT. 1) .AND. (PHI(IMAX-1) .EQ. ZERO) ) - IMAX = IMAX - 1 - END DO + IF (IMAX .GT. 1) THEN + DO WHILE( PHI(IMAX-1) .EQ. ZERO ) + IMAX = IMAX - 1 + IF (IMAX .LE. 1) EXIT + END DO + END IF IF( IMIN .GT. IMAX - 1 ) $ IMIN = IMAX - 1 - DO WHILE( (IMIN .GT. 1) .AND. (PHI(IMIN-1) .NE. ZERO) ) - IMIN = IMIN - 1 - END DO + IF (IMIN .GT. 1) THEN + DO WHILE (PHI(IMIN-1) .NE. ZERO) + IMIN = IMIN - 1 + IF (IMIN .LE. 1) EXIT + END DO + END IF * * Repeat main iteration loop * diff --git a/SRC/dbbcsd.f b/SRC/dbbcsd.f index 6ecd382..f7b1f00 100644 --- a/SRC/dbbcsd.f +++ b/SRC/dbbcsd.f @@ -316,13 +316,16 @@ * Initial deflation * IMAX = Q - DO WHILE( ( IMAX .GT. 1 ) .AND. ( PHI(IMAX-1) .EQ. 0 ) ) + DO WHILE( ( IMAX .GT. 1 ) .AND. ( PHI(IMAX-1) .EQ. ZERO ) ) IMAX = IMAX - 1 END DO IMIN = IMAX - 1 - DO WHILE( ( IMIN .GT. 1 ) .AND. ( PHI(IMIN-1) .NE. 0 ) ) - IMIN = IMIN - 1 - END DO + IF ( IMIN .GT. 1 ) THEN + DO WHILE( PHI(IMIN-1) .NE. ZERO ) + IMIN = IMIN - 1 + IF ( IMIN .LE. 1 ) EXIT + END DO + END IF * * Initialize iteration counter * @@ -846,14 +849,20 @@ * * Deflate * - DO WHILE( (IMAX .GT. 1) .AND. (PHI(IMAX-1) .EQ. ZERO) ) - IMAX = IMAX - 1 - END DO + IF (IMAX .GT. 1) THEN + DO WHILE( PHI(IMAX-1) .EQ. ZERO ) + IMAX = IMAX - 1 + IF (IMAX .LE. 1) EXIT + END DO + END IF IF( IMIN .GT. IMAX - 1 ) $ IMIN = IMAX - 1 - DO WHILE( (IMIN .GT. 1) .AND. (PHI(IMIN-1) .NE. ZERO) ) - IMIN = IMIN - 1 - END DO + IF (IMIN .GT. 1) THEN + DO WHILE (PHI(IMIN-1) .NE. ZERO) + IMIN = IMIN - 1 + IF (IMIN .LE. 1) EXIT + END DO + END IF * * Repeat main iteration loop * diff --git a/SRC/sbbcsd.f b/SRC/sbbcsd.f index 9daaf03..ed5a7f7 100644 --- a/SRC/sbbcsd.f +++ b/SRC/sbbcsd.f @@ -316,13 +316,16 @@ * Initial deflation * IMAX = Q - DO WHILE( ( IMAX .GT. 1 ) .AND. ( PHI(IMAX-1) .EQ. 0 ) ) + DO WHILE( ( IMAX .GT. 1 ) .AND. ( PHI(IMAX-1) .EQ. ZERO ) ) IMAX = IMAX - 1 END DO IMIN = IMAX - 1 - DO WHILE( ( IMIN .GT. 1 ) .AND. ( PHI(IMIN-1) .NE. 0 ) ) - IMIN = IMIN - 1 - END DO + IF ( IMIN .GT. 1 ) THEN + DO WHILE( PHI(IMIN-1) .NE. ZERO ) + IMIN = IMIN - 1 + IF ( IMIN .LE. 1 ) EXIT + END DO + END IF * * Initialize iteration counter * @@ -846,14 +849,20 @@ * * Deflate * - DO WHILE( (IMAX .GT. 1) .AND. (PHI(IMAX-1) .EQ. ZERO) ) - IMAX = IMAX - 1 - END DO + IF (IMAX .GT. 1) THEN + DO WHILE( PHI(IMAX-1) .EQ. ZERO ) + IMAX = IMAX - 1 + IF (IMAX .LE. 1) EXIT + END DO + END IF IF( IMIN .GT. IMAX - 1 ) $ IMIN = IMAX - 1 - DO WHILE( (IMIN .GT. 1) .AND. (PHI(IMIN-1) .NE. ZERO) ) - IMIN = IMIN - 1 - END DO + IF (IMIN .GT. 1) THEN + DO WHILE (PHI(IMIN-1) .NE. ZERO) + IMIN = IMIN - 1 + IF (IMIN .LE. 1) EXIT + END DO + END IF * * Repeat main iteration loop * diff --git a/SRC/zbbcsd.f b/SRC/zbbcsd.f index 19c696c..8d1125c 100644 --- a/SRC/zbbcsd.f +++ b/SRC/zbbcsd.f @@ -315,13 +315,16 @@ * Initial deflation * IMAX = Q - DO WHILE( ( IMAX .GT. 1 ) .AND. ( PHI(IMAX-1) .EQ. 0 ) ) + DO WHILE( ( IMAX .GT. 1 ) .AND. ( PHI(IMAX-1) .EQ. ZERO ) ) IMAX = IMAX - 1 END DO IMIN = IMAX - 1 - DO WHILE( ( IMIN .GT. 1 ) .AND. ( PHI(IMIN-1) .NE. 0 ) ) - IMIN = IMIN - 1 - END DO + IF ( IMIN .GT. 1 ) THEN + DO WHILE( PHI(IMIN-1) .NE. ZERO ) + IMIN = IMIN - 1 + IF ( IMIN .LE. 1 ) EXIT + END DO + END IF * * Initialize iteration counter * @@ -851,14 +854,20 @@ * * Deflate * - DO WHILE( (IMAX .GT. 1) .AND. (PHI(IMAX-1) .EQ. ZERO) ) - IMAX = IMAX - 1 - END DO + IF (IMAX .GT. 1) THEN + DO WHILE( PHI(IMAX-1) .EQ. ZERO ) + IMAX = IMAX - 1 + IF (IMAX .LE. 1) EXIT + END DO + END IF IF( IMIN .GT. IMAX - 1 ) $ IMIN = IMAX - 1 - DO WHILE( (IMIN .GT. 1) .AND. (PHI(IMIN-1) .NE. ZERO) ) - IMIN = IMIN - 1 - END DO + IF (IMIN .GT. 1) THEN + DO WHILE (PHI(IMIN-1) .NE. ZERO) + IMIN = IMIN - 1 + IF (IMIN .LE. 1) EXIT + END DO + END IF * * Repeat main iteration loop * diff --git a/TESTING/EIG/ccsdts.f b/TESTING/EIG/ccsdts.f index ffbd197..6054f5a 100644 --- a/TESTING/EIG/ccsdts.f +++ b/TESTING/EIG/ccsdts.f @@ -300,8 +300,10 @@ IF( THETA(I).LT.REALZERO .OR. THETA(I).GT.PIOVER2 ) THEN RESULT(9) = ULPINV END IF - IF( I.GT.1 .AND. THETA(I).LT.THETA(I-1) ) THEN - RESULT(9) = ULPINV + IF( I.GT.1) THEN + IF ( THETA(I).LT.THETA(I-1) ) THEN + RESULT(9) = ULPINV + END IF END IF END DO * diff --git a/TESTING/EIG/dcsdts.f b/TESTING/EIG/dcsdts.f index 1f00600..83e5ab9 100644 --- a/TESTING/EIG/dcsdts.f +++ b/TESTING/EIG/dcsdts.f @@ -299,8 +299,10 @@ IF( THETA(I).LT.REALZERO .OR. THETA(I).GT.PIOVER2 ) THEN RESULT(9) = ULPINV END IF - IF( I.GT.1 .AND. THETA(I).LT.THETA(I-1) ) THEN - RESULT(9) = ULPINV + IF( I.GT.1) THEN + IF ( THETA(I).LT.THETA(I-1) ) THEN + RESULT(9) = ULPINV + END IF END IF END DO * diff --git a/TESTING/EIG/scsdts.f b/TESTING/EIG/scsdts.f index fa7bf9f..214a0d6 100644 --- a/TESTING/EIG/scsdts.f +++ b/TESTING/EIG/scsdts.f @@ -299,8 +299,10 @@ IF( THETA(I).LT.REALZERO .OR. THETA(I).GT.PIOVER2 ) THEN RESULT(9) = ULPINV END IF - IF( I.GT.1 .AND. THETA(I).LT.THETA(I-1) ) THEN - RESULT(9) = ULPINV + IF( I.GT.1) THEN + IF ( THETA(I).LT.THETA(I-1) ) THEN + RESULT(9) = ULPINV + END IF END IF END DO * diff --git a/TESTING/EIG/zcsdts.f b/TESTING/EIG/zcsdts.f index 82f8172..3436d9e 100644 --- a/TESTING/EIG/zcsdts.f +++ b/TESTING/EIG/zcsdts.f @@ -300,8 +300,10 @@ IF( THETA(I).LT.REALZERO .OR. THETA(I).GT.PIOVER2 ) THEN RESULT(9) = ULPINV END IF - IF( I.GT.1 .AND. THETA(I).LT.THETA(I-1) ) THEN - RESULT(9) = ULPINV + IF( I.GT.1) THEN + IF ( THETA(I).LT.THETA(I-1) ) THEN + RESULT(9) = ULPINV + END IF END IF END DO * -- 2.7.4