* Bug #13512 fixed - DE: dae crashed if the evaluation function had wrong prototype 43/14843/2
Paul Bignier [Thu, 10 Jul 2014 09:09:16 +0000 (11:09 +0200)]
dae dispatches calls to dassl, dasrt and daskr.

Change-Id: I102f776be6ac5940f85675b1e355b26061723a3a

scilab/CHANGES_5.5.X
scilab/modules/differential_equations/src/fortran/ddaskr.f
scilab/modules/differential_equations/src/fortran/ddassl.f
scilab/modules/differential_equations/tests/nonreg_tests/bug_13512.dia.ref [new file with mode: 0644]
scilab/modules/differential_equations/tests/nonreg_tests/bug_13512.tst [new file with mode: 0644]

index 2f9d1e5..7705237 100644 (file)
@@ -180,6 +180,8 @@ Scilab Bug Fixes
 
 * Bug #13510 fixed - Datatip callback cleared 'd'.
 
+* Bug #13512 fixed - dae crashed if the evaluation function had wrong prototype.
+
 
 Xcos Bug Fixes
 ==============
index 04c10ae..6ea48fc 100644 (file)
@@ -1431,6 +1431,8 @@ C
 C
       SAVE LID, LENID, NONNEG, NCPHI
 C
+      COMMON /ierode/ierror
+C
 C
 C***FIRST EXECUTABLE STATEMENT  DDASKR
 C
@@ -3445,6 +3447,7 @@ C
      *   NONNEG,NTYPE,IERNLS)
 C
       IF(IERNLS .NE. 0)GO TO 600
+      IF(IDID.eq.-12) RETURN
 C
 C
 C
@@ -4744,6 +4747,9 @@ C
       SAVE MULDEL, MAXIT, XRATE
       DATA MULDEL/1/, MAXIT/4/, XRATE/0.25D0/
 C
+      COMMON /ierode/ierror
+C
+C
 C     Verify that this is the correct subroutine.
 C
       IERTYP = 0
@@ -4800,6 +4806,11 @@ C     Call RES to initialize DELTA.
 C
       IWM(LNRE)=IWM(LNRE)+1
       CALL RES(X,Y,YPRIME,DELTA,IRES,RPAR,IPAR)
+C     ierror indicates if RES had the right prototype
+      IF(ierror.ne.0) THEN
+         IDID=-12
+         RETURN
+      ENDIF
       IF (IRES .LT. 0) GO TO 380
 C
 C     If indicated, reevaluate the iteration matrix 
@@ -6021,6 +6032,9 @@ C
       SAVE MULDEL, MAXIT, XRATE
       DATA MULDEL/0/, MAXIT/4/, XRATE/0.25D0/
 C
+      COMMON /ierode/ierror
+C
+C
 C     Verify that this is the correct subroutine.
 C
       IERTYP = 0
@@ -6083,6 +6097,12 @@ C     Call RES to initialize DELTA.
 C
       IWM(LNRE)=IWM(LNRE)+1
       CALL RES(X,Y,YPRIME,DELTA,IRES,RPAR,IPAR)
+C     ierror indicates if RES had the right prototype
+      IF(ierror.ne.0) THEN
+         IDID=-12
+         RETURN
+      ENDIF
+
       IF (IRES .LT. 0) GO TO 380
 C
 C
index f53e6c5..decbb9d 100644 (file)
@@ -120,6 +120,11 @@ C     CORRECTOR LOOP.
 C
       CALL RES(X,Y,YPRIME,DELTA,IRES,RPAR,IPAR)
       if(iero.ne.0) return
+C     IERROR indicates if RES had the right prototype
+      if(IERROR.ne.0) then
+         IDID=-12
+         return
+      endif
       IF (IRES.LT.0) GO TO 430
 C
 C
@@ -1697,6 +1702,7 @@ C     COMPUTE TSTOP, IF APPLICABLE
 C
 C     COMPUTE INITIAL DERIVATIVE, UPDATING TN AND Y, IF APPLICABLE
 340   IF (INFO(11) .EQ. 0) GO TO 350
+      iero=0
       CALL DDAINI(TN,Y,YPRIME,NEQ,
      *  RES,JAC,HO,RWORK(LWT),IDID,RPAR,IPAR,
      *  RWORK(LPHI),RWORK(LDELTA),RWORK(LE),
@@ -1860,6 +1866,7 @@ C     TEST H VS. HMAX
          IF (RH .GT. 1.0D0) H = H/RH
 526   CONTINUE
 C
+      iero=0
       CALL DDASTP(TN,Y,YPRIME,NEQ,
      *   RES,JAC,H,RWORK(LWT),INFO(1),IDID,RPAR,IPAR,
      *   RWORK(LPHI),RWORK(LDELTA),RWORK(LE),
@@ -2420,6 +2427,11 @@ C     MODIFIED NEWTON SCHEME.
       IRES = 0
       iero = 0
       CALL RES(X,Y,YPRIME,DELTA,IRES,RPAR,IPAR)
+C     IERROR indicates if RES had the right prototype
+      if(IERROR.ne.0) then
+         IDID=-11
+         return
+      endif
       if(iero.ne.0) return
       IF (IRES .LT. 0) GO TO 380
 C
diff --git a/scilab/modules/differential_equations/tests/nonreg_tests/bug_13512.dia.ref b/scilab/modules/differential_equations/tests/nonreg_tests/bug_13512.dia.ref
new file mode 100644 (file)
index 0000000..0ab0e1d
--- /dev/null
@@ -0,0 +1,139 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2014 - Scilab Enterprises - Paul Bignier
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 13512 -->
+//
+// <-- Bugzilla URL -->
+//http://bugzilla.scilab.org/show_bug.cgi?id=13512
+//
+// <-- Short Description -->
+// dae crashed if the evaluation function had wrong prototype
+y0 = 0;
+t0 = 0;
+t  = 1;
+// ==================================================================
+// DASSL
+// -------------------------------
+// With initial yprime computation
+// The evaluation function purposely lacks the output argument 'ires'
+deff("ydot = f1(t, y)", "ydot = y^2 - y*sin(t) + cos(t)")
+refMsg = msprintf(_("Wrong number of output arguments."));
+assert_checkerror("y = dae(y0, t0, t, f1);", refMsg);
+ ***MESSAGE FROM ROUTINE DDASSL IN LIBRARY SLATEC.
+ ***POTENTIALLY RECOVERABLE ERROR, PROG ABORTED, TRACEBACK REQUESTED
+ *  AT T =    1.000000D-03  AND STEPSIZE H =    1.000000D-03  THE INITIAL
+ *  YPRIME COULD NOT BE COMPUTED
+ *  ERROR NUMBER = -12
+ *   
+ ***END OF MESSAGE
+ ***JOB ABORT DUE TO UNRECOVERED ERROR.
+0          ERROR MESSAGE SUMMARY
+ LIBRARY    SUBROUTINE MESSAGE START             NERR     LEVEL     COUNT
+ SLATEC     DDASSL     AT T =    1.000000D-       -12         1         1                                                                           
+// The evaluation function purposely lacks the input argument 'ydot'
+deff("[ydot,ires] = f2(t, y)", "ydot = y^2 - y*sin(t) + cos(t)");
+refMsg = msprintf(_("Wrong number of input arguments."));
+assert_checkerror("y = dae(y0, t0, t, f2);", refMsg);
+ ***MESSAGE FROM ROUTINE DDASSL IN LIBRARY SLATEC.
+ ***POTENTIALLY RECOVERABLE ERROR, PROG ABORTED, TRACEBACK REQUESTED
+ *  AT T =    1.000000D-03  AND STEPSIZE H =    1.000000D-03  THE INITIAL
+ *  YPRIME COULD NOT BE COMPUTED
+ *  ERROR NUMBER = -12
+ *   
+ ***END OF MESSAGE
+ ***JOB ABORT DUE TO UNRECOVERED ERROR.
+0          ERROR MESSAGE SUMMARY
+ LIBRARY    SUBROUTINE MESSAGE START             NERR     LEVEL     COUNT
+ SLATEC     DDASSL     AT T =    1.000000D-       -12         1         2                                                                           
+// ----------------------------------
+// Without initial yprime computation
+// The evaluation function purposely lacks the output argument 'ires'
+refMsg = msprintf(_("Wrong number of output arguments."));
+assert_checkerror("y = dae([y0; 0], t0, t, f1);", refMsg);
+ ***MESSAGE FROM ROUTINE DDASSL IN LIBRARY SLATEC.
+ ***POTENTIALLY RECOVERABLE ERROR, PROG ABORTED, TRACEBACK REQUESTED
+ *  AT T =    1.000000D-03  AND STEPSIZE H =    1.000000D-03  THE INITIAL
+ *  YPRIME COULD NOT BE COMPUTED
+ *  ERROR NUMBER = -12
+ *   
+ ***END OF MESSAGE
+ ***JOB ABORT DUE TO UNRECOVERED ERROR.
+0          ERROR MESSAGE SUMMARY
+ LIBRARY    SUBROUTINE MESSAGE START             NERR     LEVEL     COUNT
+ SLATEC     DDASSL     AT T =    1.000000D-       -12         1         3                                                                           
+// The evaluation function purposely lacks the input argument 'ydot'
+refMsg = msprintf(_("Wrong number of input arguments."));
+assert_checkerror("y = dae([y0; 0], t0, t, f2);", refMsg);
+ ***MESSAGE FROM ROUTINE DDASSL IN LIBRARY SLATEC.
+ ***POTENTIALLY RECOVERABLE ERROR, PROG ABORTED, TRACEBACK REQUESTED
+ *  AT T =    1.000000D-03  AND STEPSIZE H =    1.000000D-03  THE INITIAL
+ *  YPRIME COULD NOT BE COMPUTED
+ *  ERROR NUMBER = -12
+ *   
+ ***END OF MESSAGE
+ ***JOB ABORT DUE TO UNRECOVERED ERROR.
+0          ERROR MESSAGE SUMMARY
+ LIBRARY    SUBROUTINE MESSAGE START             NERR     LEVEL     COUNT
+ SLATEC     DDASSL     AT T =    1.000000D-       -12         1         4                                                                           
+// ==================================================================
+// DASRT
+deff("r = g(t, y)", "r = ones(y)");
+// -------------------------------
+// With initial yprime computation
+// The evaluation function purposely lacks the output argument 'ires'
+refMsg = msprintf(_("Wrong number of output arguments."));
+assert_checkerror("[y, r] = dae(""root"", y0, t0, t, f1, 1, g);", refMsg);
+// The evaluation function purposely lacks the input argument 'ydot'
+refMsg = msprintf(_("Wrong number of input arguments."));
+assert_checkerror("[y, r] = dae(""root"", y0, t0, t, f2, 1, g);", refMsg);
+// ----------------------------------
+// Without initial yprime computation
+// The evaluation function purposely lacks the output argument 'ires'
+refMsg = msprintf(_("Wrong number of output arguments."));
+assert_checkerror("[y, r] = dae(""root"", [y0; 0], t0, t, f1, 1, g);", refMsg);
+// The evaluation function purposely lacks the input argument 'ydot'
+refMsg = msprintf(_("Wrong number of input arguments."));
+assert_checkerror("[y, r] = dae(""root"", [y0; 0], t0, t, f2, 1, g);", refMsg);
+// ==================================================================
+// DASKR
+// -------------------------------
+// With initial yprime computation
+// The evaluation function purposely lacks the output argument 'ires'
+refMsg = msprintf(_("Wrong number of output arguments."));
+assert_checkerror("[y, r] = dae(""root2"", y0, t0, t, f1, 1, g);", refMsg);
+DASKR--  AT T (=R1) AND STEPSIZE H (=R2) THE                                    
+DASKR--  INITIAL (Y,YPRIME) COULD NOT BE COMPUTED                               
+      In above message,  R1 =  0.1000000000000D-02   R2 =  0.1000000000000D-02  
+// The evaluation function purposely lacks the input argument 'ydot'
+refMsg = msprintf(_("Wrong number of input arguments."));
+assert_checkerror("[y, r] = dae(""root2"", y0, t0, t, f2, 1, g);", refMsg);
+DASKR--  AT T (=R1) AND STEPSIZE H (=R2) THE                                    
+DASKR--  INITIAL (Y,YPRIME) COULD NOT BE COMPUTED                               
+      In above message,  R1 =  0.1000000000000D-02   R2 =  0.1000000000000D-02  
+// ----------------------------------
+// Without initial yprime computation
+// The evaluation function purposely lacks the output argument 'ires'
+refMsg = msprintf(_("Variable returned by scilab argument function is incorrect."));
+assert_checkerror("[y, r] = dae(""root2"", [y0; 0], t0, t, f1, 1, g);", refMsg);
+DASKR--  AT T (=R1) AND STEPSIZE H (=R2) THE                                    
+DASKR--  INITIAL (Y,YPRIME) COULD NOT BE COMPUTED                               
+      In above message,  R1 =  0.1000000000000D-02   R2 =  0.1000000000000D-02  
+// The evaluation function purposely lacks the input argument 'ydot'
+assert_checkerror("[y, r] = dae(""root2"", [y0; 0], t0, t, f2, 1, g);", refMsg);
+DASKR--  AT T (=R1) AND STEPSIZE H (=R2) THE                                    
+DASKR--  INITIAL (Y,YPRIME) COULD NOT BE COMPUTED                               
+      In above message,  R1 =  0.1000000000000D-02   R2 =  0.1000000000000D-02  
diff --git a/scilab/modules/differential_equations/tests/nonreg_tests/bug_13512.tst b/scilab/modules/differential_equations/tests/nonreg_tests/bug_13512.tst
new file mode 100644 (file)
index 0000000..01eb95f
--- /dev/null
@@ -0,0 +1,102 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2014 - Scilab Enterprises - Paul Bignier
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+//
+// <-- Non-regression test for bug 13512 -->
+//
+// <-- Bugzilla URL -->
+//http://bugzilla.scilab.org/show_bug.cgi?id=13512
+//
+// <-- Short Description -->
+// dae crashed if the evaluation function had wrong prototype
+
+y0 = 0;
+t0 = 0;
+t  = 1;
+
+// ==================================================================
+// DASSL
+
+// -------------------------------
+// With initial yprime computation
+
+// The evaluation function purposely lacks the output argument 'ires'
+deff("ydot = f1(t, y)", "ydot = y^2 - y*sin(t) + cos(t)")
+
+refMsg = msprintf(_("Wrong number of output arguments."));
+assert_checkerror("y = dae(y0, t0, t, f1);", refMsg);
+
+// The evaluation function purposely lacks the input argument 'ydot'
+deff("[ydot,ires] = f2(t, y)", "ydot = y^2 - y*sin(t) + cos(t)");
+
+refMsg = msprintf(_("Wrong number of input arguments."));
+assert_checkerror("y = dae(y0, t0, t, f2);", refMsg);
+
+// ----------------------------------
+// Without initial yprime computation
+
+// The evaluation function purposely lacks the output argument 'ires'
+refMsg = msprintf(_("Wrong number of output arguments."));
+assert_checkerror("y = dae([y0; 0], t0, t, f1);", refMsg);
+
+// The evaluation function purposely lacks the input argument 'ydot'
+refMsg = msprintf(_("Wrong number of input arguments."));
+assert_checkerror("y = dae([y0; 0], t0, t, f2);", refMsg);
+
+
+// ==================================================================
+// DASRT
+
+deff("r = g(t, y)", "r = ones(y)");
+
+// -------------------------------
+// With initial yprime computation
+
+// The evaluation function purposely lacks the output argument 'ires'
+refMsg = msprintf(_("Wrong number of output arguments."));
+assert_checkerror("[y, r] = dae(""root"", y0, t0, t, f1, 1, g);", refMsg);
+
+// The evaluation function purposely lacks the input argument 'ydot'
+refMsg = msprintf(_("Wrong number of input arguments."));
+assert_checkerror("[y, r] = dae(""root"", y0, t0, t, f2, 1, g);", refMsg);
+
+// ----------------------------------
+// Without initial yprime computation
+
+// The evaluation function purposely lacks the output argument 'ires'
+refMsg = msprintf(_("Wrong number of output arguments."));
+assert_checkerror("[y, r] = dae(""root"", [y0; 0], t0, t, f1, 1, g);", refMsg);
+
+// The evaluation function purposely lacks the input argument 'ydot'
+refMsg = msprintf(_("Wrong number of input arguments."));
+assert_checkerror("[y, r] = dae(""root"", [y0; 0], t0, t, f2, 1, g);", refMsg);
+
+
+// ==================================================================
+// DASKR
+
+// -------------------------------
+// With initial yprime computation
+
+// The evaluation function purposely lacks the output argument 'ires'
+refMsg = msprintf(_("Wrong number of output arguments."));
+assert_checkerror("[y, r] = dae(""root2"", y0, t0, t, f1, 1, g);", refMsg);
+
+// The evaluation function purposely lacks the input argument 'ydot'
+refMsg = msprintf(_("Wrong number of input arguments."));
+assert_checkerror("[y, r] = dae(""root2"", y0, t0, t, f2, 1, g);", refMsg);
+
+// ----------------------------------
+// Without initial yprime computation
+
+// The evaluation function purposely lacks the output argument 'ires'
+refMsg = msprintf(_("Variable returned by scilab argument function is incorrect."));
+assert_checkerror("[y, r] = dae(""root2"", [y0; 0], t0, t, f1, 1, g);", refMsg);
+
+// The evaluation function purposely lacks the input argument 'ydot'
+assert_checkerror("[y, r] = dae(""root2"", [y0; 0], t0, t, f2, 1, g);", refMsg);