Fixed a crash when data for correlations was empty.
authorJohn Darrington <john@darrington.wattle.id.au>
Tue, 5 Apr 2016 19:08:50 +0000 (21:08 +0200)
committerJohn Darrington <john@darrington.wattle.id.au>
Tue, 5 Apr 2016 19:23:04 +0000 (21:23 +0200)
Found by zzuf.

src/language/stats/correlations.c
tests/language/stats/correlations.at

index ba56c135c4930080c7c7837ddf2eeef3e41cef6b..ebfea2583e71f7f11fc4ebe21bf9c42572c8a633 100644 (file)
@@ -286,8 +286,8 @@ run_corr (struct casereader *r, const struct corr_opts *opts, const struct corr
 {
   struct ccase *c;
   const gsl_matrix *var_matrix,  *samples_matrix, *mean_matrix;
-  gsl_matrix *cov_matrix;
-  gsl_matrix *corr_matrix;
+  gsl_matrix *cov_matrix = NULL;
+  gsl_matrix *corr_matrix = NULL;
   struct covariance *cov = covariance_2pass_create (corr->n_vars_total, corr->vars,
                                                    NULL,
                                                    opts->wv, opts->exclude);
@@ -302,11 +302,15 @@ run_corr (struct casereader *r, const struct corr_opts *opts, const struct corr
     {
       covariance_accumulate_pass2 (cov, c);
     }
-
-  cov_matrix = covariance_calculate (cov);
-
   casereader_destroy (rc);
-
+  
+  cov_matrix = covariance_calculate (cov);
+  if (! cov_matrix)
+    {
+      msg (SE, _("The data for the chosen variables are all missing or empty."));
+      goto error;
+    }
+  
   samples_matrix = covariance_moments (cov, MOMENT_NONE);
   var_matrix = covariance_moments (cov, MOMENT_VARIANCE);
   mean_matrix = covariance_moments (cov, MOMENT_MEAN);
@@ -319,6 +323,7 @@ run_corr (struct casereader *r, const struct corr_opts *opts, const struct corr
   output_correlation (corr, opts, corr_matrix,
                      samples_matrix, cov_matrix);
 
+ error:
   covariance_destroy (cov);
   gsl_matrix_free (corr_matrix);
   gsl_matrix_free (cov_matrix);
index b2fd22f823c3b19ed7991f46b21df81ef8fda277..1de7eed195f11c4a8ff2291f3dbd9e311c60e655 100644 (file)
@@ -361,3 +361,28 @@ CORRELATIONS 'VARIABLES = a b.]
 AT_CHECK([pspp -o pspp.csv correlations.sps], [1], [ignore])
 
 AT_CLEANUP
+
+dnl Another Crash found by zzuf
+AT_SETUP([CORRELATIONS -- empty dataset 2])
+
+AT_DATA([correlations.sps], [dnl
+data list notable list /foo * bar * wiz bang *.
+begin data.
+ 1     00      3           .
+ 3     9     -50           .
+98    78     104           .
+ .     4       4           .
+ 5     3       0           .
+end data.
+
+correlations
+        variables = foo bar wiz bang
+        /missing = listwise
+        .
+])
+
+AT_CHECK([pspp -O format=csv correlations.sps], [1], [dnl
+correlations.sps:13: error: CORRELATIONS: The data for the chosen variables are all missing or empty.
+])
+
+AT_CLEANUP