* Bug 15907 fixed: filter was corrupting its input state array 68/20668/3
St├ęphane Mottelet [Wed, 19 Dec 2018 09:21:20 +0000 (10:21 +0100)]
http://bugzilla.scilab.org/show_bug.cgi?id=15907

Change-Id: I572cd3cf01a7f8e49829cdb583a4cdb9e8e5d244

scilab/CHANGES.md
scilab/modules/signal_processing/sci_gateway/cpp/sci_filter.cpp
scilab/modules/signal_processing/tests/nonreg_tests/bug_15907.tst [new file with mode: 0644]

index 96edffe..70ec670 100644 (file)
@@ -656,6 +656,7 @@ Known issues
 * [#15878](http://bugzilla.scilab.org/show_bug.cgi?id=15878): `sgrid` and `evans` were broken.
 * [#15880](http://bugzilla.scilab.org/show_bug.cgi?id=15880): `sgrid` needed some improvements: Labeling was sometimes ambiguous ; large circles were not labeled ; data_bounds did not always take the input wn into account ; named and #RRGGBB colors specifications could not be used. `evans` needed some improvements: the block of legends hid data ; asymptotes were too visible.
 * [#15890](http://bugzilla.scilab.org/show_bug.cgi?id=15890): `evstr` sometimes yielded some `+[]` warnings.
+* [#15907](http://bugzilla.scilab.org/show_bug.cgi?id=15907): `filter` was corrupting its input state array
 * [#15920](http://bugzilla.scilab.org/show_bug.cgi?id=15920): genlib() did not regenerate a missing .bin if the .sci was unchanged (Scilab 6 regression)
 
 
index d568079..e675779 100644 (file)
@@ -224,7 +224,6 @@ types::Function::ReturnValue sci_filter(types::typed_list &in, int _iRetCount, t
 {
     int iRhs = (int)in.size();
 
-    bool alloc_si = false;
     types::Double* b = nullptr;
     types::Double* a = nullptr;
     types::Double* x = nullptr;
@@ -260,11 +259,10 @@ types::Function::ReturnValue sci_filter(types::typed_list &in, int _iRetCount, t
 
     if (iRhs > 3)
     {
-        si = in[3]->getAs<types::Double>();
+        si = in[3]->getAs<types::Double>()->clone();
     }
     else
     {
-        alloc_si = true;
         int size_a = a->getSize();
         int size_b = b->getSize();
         int len = std::max(size_a, size_b) - 1;
@@ -307,7 +305,7 @@ types::Function::ReturnValue sci_filter(types::typed_list &in, int _iRetCount, t
     }
 
     types::Double* ret = filter(b, a, x, si);
-    if (_iRetCount != 2 && alloc_si)
+    if (_iRetCount != 2)
     {
         si->killMe();
     }
diff --git a/scilab/modules/signal_processing/tests/nonreg_tests/bug_15907.tst b/scilab/modules/signal_processing/tests/nonreg_tests/bug_15907.tst
new file mode 100644 (file)
index 0000000..ba459e8
--- /dev/null
@@ -0,0 +1,28 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2018 - St├ęphane Mottelet
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- CLI SHELL MODE -->
+// <-- NO CHECK REF -->
+//
+// <-- Non-regression test for bug 15907 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/15907
+//
+// <-- Short Description -->
+// filter is corrupting its input state array (Scilab 6 regression)
+
+[cells fact zzeros zpoles] = eqiir('lp','ellip',[2*%pi/10,4*%pi/10],0.02,0.001);
+h = fact*poly(zzeros,'z')/poly(zpoles,'z');
+b = coeff(h.num)($:-1:1);
+a = coeff(h.den)($:-1:1);
+si=zeros(max(length(a),length(b))-1,1);
+pulse=zeros(1000,1);
+pulse(5)=1;
+[impulse_response so]=filter(b,a,pulse,si);
+   
+assert_checkequal(si,zeros(max(length(a),length(b))-1,1));
\ No newline at end of file