Changeset 74330e7


Ignore:
Timestamp:
Feb 8, 2020, 10:07:49 AM (5 years ago)
Author:
Peter A. Buhr <pabuhr@…>
Branches:
ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, pthread-emulation, qualifiedEnum
Children:
3ecfa13
Parents:
3e274ab
Message:

formatting, add floating-point signal handler to cpp-cc to catch division by 0 in constant-expression evaluations

Files:
2 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/interpose.cfa

    r3e274ab r74330e7  
    1010// Created On       : Wed Mar 29 16:10:31 2017
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Feb  4 11:38:20 2020
    13 // Update Count     : 161
     12// Last Modified On : Sat Feb  8 08:40:34 2020
     13// Update Count     : 163
    1414//
    1515
     
    170170
    171171static void __cfaabi_backtrace( int start ) {
    172         enum {
    173                 Frames = 50,                                                                    // maximum number of stack frames
    174         };
     172        enum { Frames = 50, };                                                          // maximum number of stack frames
    175173        int last = kernel_abort_lastframe();                            // skip last N stack frames
    176174
    177175        void * array[Frames];
    178176        size_t size = backtrace( array, Frames );
    179         char ** messages = backtrace_symbols( array, size );
     177        char ** messages = backtrace_symbols( array, size ); // does not demangle names
    180178
    181179        *index( messages[0], '(' ) = '\0';                                      // find executable name
     
    185183                char * name = 0p, * offset_begin = 0p, * offset_end = 0p;
    186184
    187                 for ( char * p = messages[i]; *p; ++p ) {               // find parantheses and +offset
     185                for ( char * p = messages[i]; *p; p += 1 ) {    // find parantheses and +offset
    188186                        //__cfaabi_bits_print_nolock( "X %s\n", p);
    189187                        if ( *p == '(' ) {
     
    237235        __cfaabi_bits_write( STDERR_FILENO, abort_text, len );
    238236
    239         if ( fmt[strlen( fmt ) - 1] != '\n' ) {                 // add optional newline if missing at the end of the format text
     237        if ( fmt[strlen( fmt ) - 1] != '\n' ) {                         // add optional newline if missing at the end of the format text
    240238                __cfaabi_dbg_write( "\n", 1 );
    241239        }
  • src/main.cc

    r3e274ab r74330e7  
    1010// Created On       : Fri May 15 23:12:02 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon Dec 16 17:55:53 2019
    13 // Update Count     : 627
     12// Last Modified On : Sat Feb  8 08:33:50 2020
     13// Update Count     : 633
    1414//
    1515
     
    105105
    106106static void backtrace( int start ) {                                    // skip first N stack frames
    107         enum { Frames = 50 };
     107        enum { Frames = 50, };                                                          // maximum number of stack frames
    108108        void * array[Frames];
    109         int size = ::backtrace( array, Frames );
     109        size_t size = ::backtrace( array, Frames );
    110110        char ** messages = ::backtrace_symbols( array, size ); // does not demangle names
    111111
     
    114114
    115115        // skip last 2 stack frames after main
    116         for ( int i = start; i < size - 2 && messages != nullptr; i += 1 ) {
     116        for ( unsigned int i = start; i < size - 2 && messages != nullptr; i += 1 ) {
    117117                char * mangled_name = nullptr, * offset_begin = nullptr, * offset_end = nullptr;
    118118
     
    180180} // sigSegvBusHandler
    181181
     182static void sigFpeHandler( SIGPARMS ) {
     183        const char * msg;
     184
     185        switch ( sfp->si_code ) {
     186          case FPE_INTDIV: case FPE_FLTDIV: msg = "divide by zero"; break;
     187          case FPE_FLTOVF: msg = "overflow"; break;
     188          case FPE_FLTUND: msg = "underflow"; break;
     189          case FPE_FLTRES: msg = "inexact result"; break;
     190          case FPE_FLTINV: msg = "invalid operation"; break;
     191          default: msg = "unknown";
     192        } // choose
     193        cerr << "Computation error " << msg << " at location " << sfp->si_addr << endl
     194                 << "Possible cause is constant-expression evaluation invalid." << endl;
     195        backtrace( 2 );                                                                         // skip first 2 stack frames
     196        abort();                                                                                        // cause core dump for debugging
     197} // sigFpeHandler
     198
    182199static void sigAbortHandler( SIGPARMS ) {
    183200        backtrace( 6 );                                                                         // skip first 6 stack frames
     
    193210        Signal( SIGSEGV, sigSegvBusHandler, SA_SIGINFO );
    194211        Signal( SIGBUS, sigSegvBusHandler, SA_SIGINFO );
     212        Signal( SIGFPE, sigFpeHandler, SA_SIGINFO );
    195213        Signal( SIGABRT, sigAbortHandler, SA_SIGINFO );
    196214
Note: See TracChangeset for help on using the changeset viewer.