Added a signal handler for SIGFPE
authorJohn Darrington <john@darrington.wattle.id.au>
Thu, 6 Jan 2005 12:55:44 +0000 (12:55 +0000)
committerJohn Darrington <john@darrington.wattle.id.au>
Thu, 6 Jan 2005 12:55:44 +0000 (12:55 +0000)
(Re)Fixed an assertion in sort.c
Added a test for sorting with ENORMOUS input files.
Added a test to ensure that fatal errors are reported properly.
Tidied up a few other tests.

12 files changed:
po/en_GB.po
po/pspp.pot
src/ChangeLog
src/main.c
src/sort.c
tests/Makefile.am
tests/bugs/big-input-2.sh [new file with mode: 0755]
tests/bugs/big-input.sh
tests/bugs/data-crash.sh
tests/bugs/t-test.sh
tests/bugs/terminate.sh [new file with mode: 0755]
tests/bugs/val-labs.sh

index 4e60da85d493b5a97607f23bfaa3b415a8738427..defa88591af0ec1ff499c56e30a5467cdb6e0a9a 100644 (file)
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PSPP 0.3.1\n"
 "Report-Msgid-Bugs-To: pspp-dev@gnu.org\n"
-"POT-Creation-Date: 2005-01-05 08:20+0800\n"
+"POT-Creation-Date: 2005-01-05 22:50+0800\n"
 "PO-Revision-Date: 2004-01-23 13:04+0800\n"
 "Last-Translator: John Darrington <john@darrington.wattle.id.au>\n"
 "Language-Team: John Darrington <john@darrington.wattle.id.au>\n"
@@ -2714,6 +2714,26 @@ msgstr ""
 msgid "Error opening page on %s device of %s class."
 msgstr ""
 
+#: src/percentiles.c:38
+msgid "HAverage"
+msgstr ""
+
+#: src/percentiles.c:39
+msgid "Weighted Average"
+msgstr ""
+
+#: src/percentiles.c:40
+msgid "Rounded"
+msgstr ""
+
+#: src/percentiles.c:41
+msgid "Empirical"
+msgstr ""
+
+#: src/percentiles.c:42
+msgid "Empirical with averaging"
+msgstr ""
+
 #: src/permissions.c:75
 #, c-format
 msgid "Expecting %s or %s."
index 170e85d7e2737a82f924a1c73d64ac62bc51d4cd..7cf0a1d61ba57bde05c4c13ae6488b250b24c814 100644 (file)
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: pspp-dev@gnu.org\n"
-"POT-Creation-Date: 2005-01-05 08:20+0800\n"
+"POT-Creation-Date: 2005-01-05 22:50+0800\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -2714,6 +2714,26 @@ msgstr ""
 msgid "Error opening page on %s device of %s class."
 msgstr ""
 
+#: src/percentiles.c:38
+msgid "HAverage"
+msgstr ""
+
+#: src/percentiles.c:39
+msgid "Weighted Average"
+msgstr ""
+
+#: src/percentiles.c:40
+msgid "Rounded"
+msgstr ""
+
+#: src/percentiles.c:41
+msgid "Empirical"
+msgstr ""
+
+#: src/percentiles.c:42
+msgid "Empirical with averaging"
+msgstr ""
+
 #: src/permissions.c:75
 #, c-format
 msgid "Expecting %s or %s."
index 2e1ecee5323b6006ce36c2d35014c6fc044ca744..3f3e65bc6a8d5ff6f0e463a9c54982f14f3a5190 100644 (file)
@@ -1,3 +1,9 @@
+Thu Jan  6 18:48:58 WST 2005 John Darrington <john@darrington.wattle.id.au>
+
+       * main.c Added a signal handler for SIGFPE
+
+       * sort.c Somewhat more robust fix to the previous entry.
+
 Wed Jan  5 21:23:31 2005  Ben Pfaff  <blp@gnu.org>
 
        * sort.c: (merge) Fix assertion for proper Huffman merge pattern:
index b4aa243518f7851e3adbf496ebe51059ef730a74..b09a200a66bcf6f23215f3fcad058b9270e637fe 100644 (file)
@@ -64,6 +64,7 @@ int
 main (int argc, char **argv)
 {
   signal (SIGSEGV, bug_handler);
+  signal (SIGFPE, bug_handler);
 
   gsl_set_error_handler_off();
 
@@ -185,5 +186,16 @@ handle_error (int code)
 void 
 bug_handler(int sig UNUSED)
 {
-  request_bug_report_and_abort("Segmentation Violation");
+  switch (sig) 
+    {
+    case SIGFPE:
+      request_bug_report_and_abort("Floating Point Exception");
+      break;
+    case SIGSEGV:
+      request_bug_report_and_abort("Segmentation Violation");
+      break;
+    default:
+      request_bug_report_and_abort("");
+      break;
+    }
 }
index 5a6cf6a11ed355735e56b105928570f1820b5687..2aa800e0263cc69d03cbd722e3bf28c19629fb00 100644 (file)
@@ -752,7 +752,9 @@ merge (struct external_sort *xsrt)
   make_heap (xsrt->initial_runs, xsrt->run_cnt, sizeof *xsrt->initial_runs,
              compare_initial_runs, NULL);
   dummy_run_cnt = mod (1 - (int) xsrt->run_cnt, max_order - 1);
-  assert (max_order == 2
+
+  assert( max_order > 0 );
+  assert (max_order <= 2
           || (xsrt->run_cnt + dummy_run_cnt) % (max_order - 1) == 1);
   while (xsrt->run_cnt > 1)
     {
index 9b2946eed43f8002a338d76389c220d0c953fb12..66faad06b3eaaa52e98628ab997ff9d1f6bbbaae 100644 (file)
@@ -43,6 +43,7 @@ TESTS = \
        command/weight.sh \
        bugs/alpha-freq.sh \
        bugs/big-input.sh \
+       bugs/big-input-2.sh \
        bugs/comment-at-eof.sh \
        bugs/compute-fmt.sh \
        bugs/crosstabs.sh \
@@ -57,6 +58,7 @@ TESTS = \
        bugs/t-test.sh \
        bugs/t-test-alpha.sh \
        bugs/t-test-alpha2.sh \
+       bugs/terminate.sh \
        bugs/temporary.sh \
        bugs/val-labs.sh \
        bugs/val-labs-trailing-slash.sh \
diff --git a/tests/bugs/big-input-2.sh b/tests/bugs/big-input-2.sh
new file mode 100755 (executable)
index 0000000..ee29226
--- /dev/null
@@ -0,0 +1,103 @@
+#!/bin/sh
+
+# This program tests for a bug which caused  a crash when 
+# very large files are presented.
+
+
+TEMPDIR=/tmp/pspp-tst-$$
+
+here=`pwd`;
+
+# ensure that top_srcdir is absolute
+cd $top_srcdir; top_srcdir=`pwd`
+
+export STAT_CONFIG_PATH=$top_srcdir/config
+
+
+cleanup()
+{
+     rm -rf $TEMPDIR
+}
+
+
+fail()
+{
+    echo $activity
+    echo FAILED
+    cleanup;
+    exit 1;
+}
+
+
+no_result()
+{
+    echo $activity
+    echo NO RESULT;
+    cleanup;
+    exit 2;
+}
+
+pass()
+{
+    cleanup;
+    exit 0;
+}
+
+mkdir -p $TEMPDIR
+
+cd $TEMPDIR
+
+activity="delete data"
+rm -f $TEMPDIR/large.dat
+if [ $? -ne 0 ] ; then no_result ; fi
+
+printf "Creating input data.  Please wait"
+activity="create data"
+i=0
+while [ $i -lt 100000 ] ; do 
+       echo AB12 >> $TEMPDIR/large.dat;
+       i=$[$i + 1];
+done;
+printf '.'
+i=0
+while [ $i -lt 100000 ] ; do 
+       echo AB04 >> $TEMPDIR/large.dat;
+       i=$[$i + 1];
+done;
+if [ $? -ne 0 ] ; then no_result ; fi
+printf "\n";
+
+activity="create program"
+cat > $TEMPDIR/large.sps <<EOF
+DATA LIST FILE='$TEMPDIR/large.dat' /S 1-2 (A) X 3 .
+
+
+AGGREGATE /BREAK=X /A=N.
+
+
+EXAMINE /A BY /X.
+EOF
+if [ $? -ne 0 ] ; then no_result ; fi
+
+activity="run program"
+$SUPERVISOR $here/../src/pspp -o raw-ascii $TEMPDIR/large.sps > /dev/null
+if [ $? -ne 0 ] ; then fail ; fi
+
+
+activity="appending to data"
+# Put another 100,000 cases into large.dat
+i=0
+while [ $i -lt 50000 ] ; do 
+       echo AB04 >> $TEMPDIR/large.dat;
+       echo AB12 >> $TEMPDIR/large.dat;
+       i=$[$i + 1];
+done;
+if [ $? -ne 0 ] ; then no_result ; fi
+
+activity="run program"
+$SUPERVISOR $here/../src/pspp -o raw-ascii $TEMPDIR/large.sps > /dev/null
+if [ $? -ne 0 ] ; then fail ; fi
+
+
+
+pass;
index 84f7abef476fe33f81107d69aa6d458544dc52e1..d15cde4e12f28f24ba1398989df17b2500b2c483 100755 (executable)
@@ -50,20 +50,21 @@ cd $TEMPDIR
 activity="create program"
 cat > $TEMPDIR/foo.sps <<EOF
 INPUT PROGRAM.
-LOOP #I=1 TO 50000.
-COMPUTE X=NORMAL(10).
-END CASE.
-END LOOP.
-END FILE.
+       LOOP #I=1 TO 50000.
+               COMPUTE X=NORMAL(10).
+               END CASE.
+       END LOOP.
+       END FILE.
 END INPUT PROGRAM.
 
 
 EXAMINE /x
-/STATISTICS=DESCRIPTIVES.
+       /STATISTICS=DESCRIPTIVES.
 EOF
 if [ $? -ne 0 ] ; then no_result ; fi
 
+activity="run program"
 $SUPERVISOR $here/../src/pspp -o raw-ascii $TEMPDIR/foo.sps > /dev/null
-if [ $? -ne 1 ] ; then fail ; fi
+if [ $? -ne 0 ] ; then fail ; fi
 
 pass;
index b1d453a8bce178977e4c2033b883f200bc8aafcf..d005680d3503d6af359fd438d6c6c96bd6a33747 100755 (executable)
@@ -54,7 +54,8 @@ EXECUTE.
 EOF
 if [ $? -ne 0 ] ; then no_result ; fi
 
-
+#This must fail
+activity="run program"
 $SUPERVISOR $here/../src/pspp $TEMPDIR/ct.stat > /dev/null
 if [ $? -ne 1 ] ; then fail ; fi
 
index 7896b77180f068c076f850a7d8cf52fab24ec4f6..6ce101f0a298765f4bbe00ea6e3bc6abb9e0a2f4 100755 (executable)
@@ -64,6 +64,8 @@ T-TEST /groups=id(3) .
 EOF
 if [ $? -ne 0 ] ; then no_result ; fi
 
+#The syntax was invalid.  Therefore pspp must return non zero.
+activity="run program"
 $SUPERVISOR $here/../src/pspp -o raw-ascii $TEMPDIR/rnd.sps > /dev/null
 if [ $? -ne 1 ] ; then fail ; fi
 
diff --git a/tests/bugs/terminate.sh b/tests/bugs/terminate.sh
new file mode 100755 (executable)
index 0000000..6e1168b
--- /dev/null
@@ -0,0 +1,75 @@
+#!/bin/sh
+
+# This  tests checks that when a fatal error occurs,
+# and appropriate notice is printed and the program exits with a 
+# non zero status
+
+
+TEMPDIR=/tmp/pspp-tst-$$
+
+here=`pwd`;
+
+# ensure that top_srcdir is absolute
+cd $top_srcdir; top_srcdir=`pwd`
+
+export STAT_CONFIG_PATH=$top_srcdir/config
+
+
+cleanup()
+{
+     rm -rf $TEMPDIR
+}
+
+
+fail()
+{
+    echo $activity
+    echo FAILED
+    cleanup;
+    exit 1;
+}
+
+
+no_result()
+{
+    echo $activity
+    echo NO RESULT;
+    cleanup;
+    exit 2;
+}
+
+pass()
+{
+    cleanup;
+    exit 0;
+}
+
+mkdir -p $TEMPDIR
+
+cd $TEMPDIR
+
+
+activity="delete file"
+rm -f $TEMPDIR/bar.dat
+if [ $? -ne 0 ] ; then no_result ; fi
+
+activity="create program"
+cat > $TEMPDIR/foo.sps <<EOF
+DATA LIST FILE='$TEMPDIR/bar.dat' /S 1-2 (A) X 3 .
+
+EXECUTE.
+EOF
+if [ $? -ne 0 ] ; then no_result ; fi
+
+activity="run program"
+# This must exit with non zero status
+$SUPERVISOR $here/../src/pspp -o raw-ascii $TEMPDIR/foo.sps > /dev/null 2> $TEMPDIR/stderr
+if [ $? -eq 0 ] ; then fail ; fi
+
+activity="compare stderr"
+diff $TEMPDIR/stderr - << EOF
+pspp: Terminating NOW due to a fatal error!
+EOF
+if [ $? -ne 0 ] ; then fail ; fi
+
+pass;
index fc052b7b86bc1189177d912431e0003c3cd5479c..9fcf39ed0663314b470969898c845104c8a8b710 100755 (executable)
@@ -64,6 +64,8 @@ VALUE LABELS /var=a 'label for a'.
 EOF
 if [ $? -ne 0 ] ; then no_result ; fi
 
+#Invalid syntax --- return value is non zero.
+activity="run program"
 $SUPERVISOR $here/../src/pspp -o raw-ascii $TEMPDIR/rnd.sps > /dev/null
 if [ $? -ne 1 ] ; then fail ; fi