Index: libcfa/src/interpose.cfa
===================================================================
--- libcfa/src/interpose.cfa	(revision 3e274ab398b76521d38b9bbfb1ffa9fba7f35a79)
+++ libcfa/src/interpose.cfa	(revision 74330e70ac91b5ec34b6f71f01730ecbbf4e3af7)
@@ -10,6 +10,6 @@
 // Created On       : Wed Mar 29 16:10:31 2017
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Feb  4 11:38:20 2020
-// Update Count     : 161
+// Last Modified On : Sat Feb  8 08:40:34 2020
+// Update Count     : 163
 //
 
@@ -170,12 +170,10 @@
 
 static void __cfaabi_backtrace( int start ) {
-	enum {
-		Frames = 50,									// maximum number of stack frames
-	};
+	enum { Frames = 50, };								// maximum number of stack frames
 	int last = kernel_abort_lastframe();				// skip last N stack frames
 
 	void * array[Frames];
 	size_t size = backtrace( array, Frames );
-	char ** messages = backtrace_symbols( array, size );
+	char ** messages = backtrace_symbols( array, size ); // does not demangle names
 
 	*index( messages[0], '(' ) = '\0';					// find executable name
@@ -185,5 +183,5 @@
 		char * name = 0p, * offset_begin = 0p, * offset_end = 0p;
 
-		for ( char * p = messages[i]; *p; ++p ) {		// find parantheses and +offset
+		for ( char * p = messages[i]; *p; p += 1 ) {	// find parantheses and +offset
 			//__cfaabi_bits_print_nolock( "X %s\n", p);
 			if ( *p == '(' ) {
@@ -237,5 +235,5 @@
 	__cfaabi_bits_write( STDERR_FILENO, abort_text, len );
 
-	if ( fmt[strlen( fmt ) - 1] != '\n' ) {			// add optional newline if missing at the end of the format text
+	if ( fmt[strlen( fmt ) - 1] != '\n' ) {				// add optional newline if missing at the end of the format text
 		__cfaabi_dbg_write( "\n", 1 );
 	}
Index: src/main.cc
===================================================================
--- src/main.cc	(revision 3e274ab398b76521d38b9bbfb1ffa9fba7f35a79)
+++ src/main.cc	(revision 74330e70ac91b5ec34b6f71f01730ecbbf4e3af7)
@@ -10,6 +10,6 @@
 // Created On       : Fri May 15 23:12:02 2015
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Dec 16 17:55:53 2019
-// Update Count     : 627
+// Last Modified On : Sat Feb  8 08:33:50 2020
+// Update Count     : 633
 //
 
@@ -105,7 +105,7 @@
 
 static void backtrace( int start ) {					// skip first N stack frames
-	enum { Frames = 50 };
+	enum { Frames = 50, };								// maximum number of stack frames
 	void * array[Frames];
-	int size = ::backtrace( array, Frames );
+	size_t size = ::backtrace( array, Frames );
 	char ** messages = ::backtrace_symbols( array, size ); // does not demangle names
 
@@ -114,5 +114,5 @@
 
 	// skip last 2 stack frames after main
-	for ( int i = start; i < size - 2 && messages != nullptr; i += 1 ) {
+	for ( unsigned int i = start; i < size - 2 && messages != nullptr; i += 1 ) {
 		char * mangled_name = nullptr, * offset_begin = nullptr, * offset_end = nullptr;
 
@@ -180,4 +180,21 @@
 } // sigSegvBusHandler
 
+static void sigFpeHandler( SIGPARMS ) {
+	const char * msg;
+
+	switch ( sfp->si_code ) {
+	  case FPE_INTDIV: case FPE_FLTDIV: msg = "divide by zero"; break;
+	  case FPE_FLTOVF: msg = "overflow"; break;
+	  case FPE_FLTUND: msg = "underflow"; break;
+	  case FPE_FLTRES: msg = "inexact result"; break;
+	  case FPE_FLTINV: msg = "invalid operation"; break;
+	  default: msg = "unknown";
+	} // choose
+	cerr << "Computation error " << msg << " at location " << sfp->si_addr << endl
+		 << "Possible cause is constant-expression evaluation invalid." << endl;
+	backtrace( 2 );										// skip first 2 stack frames
+	abort();											// cause core dump for debugging
+} // sigFpeHandler
+
 static void sigAbortHandler( SIGPARMS ) {
 	backtrace( 6 );										// skip first 6 stack frames
@@ -193,4 +210,5 @@
 	Signal( SIGSEGV, sigSegvBusHandler, SA_SIGINFO );
 	Signal( SIGBUS, sigSegvBusHandler, SA_SIGINFO );
+	Signal( SIGFPE, sigFpeHandler, SA_SIGINFO );
 	Signal( SIGABRT, sigAbortHandler, SA_SIGINFO );
 
