Fix seg fault parsing invalid exponents
Add error message when exponents are incomplete,
for example 5e and 5.e
diff --git a/CHANGES.current b/CHANGES.current
index 07ab418..0618e97 100644
--- a/CHANGES.current
+++ b/CHANGES.current
@@ -7,6 +7,9 @@
Version 4.0.0 (in progress)
===========================
+2018-01-14: wsfulton
+ Fix issue #1172. Seg fault parsing invalid exponents in the preprocessor.
+
2018-01-12: Liryna
[C#] Patch #1128. Add ToArray function to std::vector wrappers.
diff --git a/Examples/test-suite/errors/cpp_invalid_exponents1.i b/Examples/test-suite/errors/cpp_invalid_exponents1.i
new file mode 100644
index 0000000..1ff2c36
--- /dev/null
+++ b/Examples/test-suite/errors/cpp_invalid_exponents1.i
@@ -0,0 +1,4 @@
+%module xxx
+
+void bad(double nn = 5e);
+
diff --git a/Examples/test-suite/errors/cpp_invalid_exponents1.stderr b/Examples/test-suite/errors/cpp_invalid_exponents1.stderr
new file mode 100644
index 0000000..6096114
--- /dev/null
+++ b/Examples/test-suite/errors/cpp_invalid_exponents1.stderr
@@ -0,0 +1,2 @@
+cpp_invalid_exponents1.i:3: Error: Exponent does not have any digits
+cpp_invalid_exponents1.i:3: Error: Syntax error in input(1).
diff --git a/Examples/test-suite/errors/cpp_invalid_exponents2.i b/Examples/test-suite/errors/cpp_invalid_exponents2.i
new file mode 100644
index 0000000..2e07487
--- /dev/null
+++ b/Examples/test-suite/errors/cpp_invalid_exponents2.i
@@ -0,0 +1,4 @@
+%module xxx
+
+void bad(double nn = 6.6e);
+
diff --git a/Examples/test-suite/errors/cpp_invalid_exponents2.stderr b/Examples/test-suite/errors/cpp_invalid_exponents2.stderr
new file mode 100644
index 0000000..e7d1bf0
--- /dev/null
+++ b/Examples/test-suite/errors/cpp_invalid_exponents2.stderr
@@ -0,0 +1,2 @@
+cpp_invalid_exponents2.i:3: Error: Exponent does not have any digits
+cpp_invalid_exponents2.i:3: Error: Syntax error in input(1).
diff --git a/Examples/test-suite/errors/pp_invalid_exponents.i b/Examples/test-suite/errors/pp_invalid_exponents.i
new file mode 100644
index 0000000..73dcdb1
--- /dev/null
+++ b/Examples/test-suite/errors/pp_invalid_exponents.i
@@ -0,0 +1,7 @@
+%module xxx
+
+#if 123e
+#endif
+
+#if 456.e
+#endif
diff --git a/Examples/test-suite/errors/pp_invalid_exponents.stderr b/Examples/test-suite/errors/pp_invalid_exponents.stderr
new file mode 100644
index 0000000..735a31c
--- /dev/null
+++ b/Examples/test-suite/errors/pp_invalid_exponents.stderr
@@ -0,0 +1,6 @@
+:EOF: Error: Exponent does not have any digits
+pp_invalid_exponents.i:3: Warning 202: Could not evaluate expression '123e'
+pp_invalid_exponents.i:3: Warning 202: Error: 'Syntax error'
+:EOF: Error: Exponent does not have any digits
+pp_invalid_exponents.i:6: Warning 202: Could not evaluate expression '456.e'
+pp_invalid_exponents.i:6: Warning 202: Error: 'Syntax error'
diff --git a/Source/Swig/scanner.c b/Source/Swig/scanner.c
index f62ddda..af4a38a 100644
--- a/Source/Swig/scanner.c
+++ b/Source/Swig/scanner.c
@@ -1118,27 +1118,29 @@
break;
case 82:
if ((c = nextchar(s)) == 0) {
- retract(s, 1);
- return SWIG_TOKEN_INT;
+ Swig_error(cparse_file, cparse_start_line, "Exponent does not have any digits\n");
+ return SWIG_TOKEN_ERROR;
}
if ((isdigit(c)) || (c == '-') || (c == '+'))
state = 86;
else {
retract(s, 2);
- return (SWIG_TOKEN_INT);
+ Swig_error(cparse_file, cparse_start_line, "Exponent does not have any digits\n");
+ return SWIG_TOKEN_ERROR;
}
break;
case 820:
/* Like case 82, but we've seen a decimal point. */
if ((c = nextchar(s)) == 0) {
- retract(s, 1);
- return SWIG_TOKEN_DOUBLE;
+ Swig_error(cparse_file, cparse_start_line, "Exponent does not have any digits\n");
+ return SWIG_TOKEN_ERROR;
}
if ((isdigit(c)) || (c == '-') || (c == '+'))
state = 86;
else {
retract(s, 2);
- return (SWIG_TOKEN_DOUBLE);
+ Swig_error(cparse_file, cparse_start_line, "Exponent does not have any digits\n");
+ return SWIG_TOKEN_ERROR;
}
break;
case 83: