pastebin - collaborative debugging tool
rovema.kpaste.net RSS


sig_fpu_trigger1.cpp
Posted by Anonymous on Mon 14th Feb 2022 11:34
raw | new post
modification of post by Anonymous (view diff)

  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include <stdio.h>
  4. #include <setjmp.h>
  5. #include <signal.h>
  6. #include <math.h>
  7. #include <fenv.h>
  8. #include <limits.h>
  9.  
  10. #include <stdexcept>
  11. #include <iostream>
  12. #include <cfloat>
  13.  
  14.  
  15. static sigjmp_buf jmp_env;
  16. static volatile siginfo_t saved_siginfo;
  17.  
  18. static void sigfpe_handler(int num, siginfo_t *info, void *ucontext)
  19. {
  20.         (void)num;
  21.         (void)ucontext;
  22.  
  23.         (void)feclearexcept(FE_ALL_EXCEPT);
  24.         (void)memcpy((void *)&saved_siginfo, info, sizeof(saved_siginfo));
  25.  
  26. #if 1
  27.         siglongjmp(jmp_env, 1);
  28. #else
  29.         throw std::invalid_argument( "you violated the fp math rules" );
  30. #endif
  31. }
  32.  
  33. int main(int ac, char *av[])
  34. {
  35.         struct sigaction action;
  36.         int ret;
  37.         int i = 0, j = 0;
  38.  
  39.         (void)puts("#start.");
  40.        
  41.         (void)memset(&action, 0, sizeof action);
  42.  
  43.         action.sa_sigaction = sigfpe_handler;
  44.         (void)sigemptyset(&action.sa_mask);
  45.         action.sa_flags = SA_SIGINFO;
  46.         (void)sigaction(SIGFPE, &action, NULL);
  47.  
  48.         int mask = feenableexcept(
  49.                         FE_INVALID   |
  50.                         FE_DIVBYZERO |
  51.                         FE_OVERFLOW  |
  52.                         FE_UNDERFLOW |
  53.                         FE_INEXACT);
  54.         (void)printf("mask: %x\n", mask);      
  55.        
  56.         try
  57.         {
  58.                 ret = sigsetjmp(jmp_env, 1);
  59.                 if (ret) {
  60.                         (void)puts("#got_signal");
  61.                 }
  62.                 else
  63.                 {
  64.                         (void)puts("#begin_math");
  65. #if 1
  66. #if 1
  67.                         volatile int foo_l = 1000L*1000L*1000L;
  68.                         double foo_d = DBL_MAX;
  69.                         foo_d += 1;
  70.                        
  71.                         (void)printf("foo_d=%f\n", foo_d);
  72. #else
  73.                         i = i / j;
  74. #endif
  75. #else
  76.                         i = INT_MIN;
  77.                         j = -1;
  78.                        
  79.                         i = i / j;
  80. #endif
  81.                         (void)puts("#end_math");
  82.                 }
  83.         }
  84.         catch( const std::invalid_argument &e )
  85.         {
  86.                 std::cout << std::string("#got_exception '") + e.what() + "' \n";
  87.         }
  88.  
  89.         (void)printf("i=%d, j=%d\n", i, j);
  90.  
  91.         (void)puts("#end.");
  92.         return EXIT_SUCCESS;
  93. }

Submit a correction or amendment below (click here to make a fresh posting)
After submitting an amendment, you'll be able to view the differences between the old and new posts easily.

Syntax highlighting:

To highlight particular lines, prefix each line with {%HIGHLIGHT}




All content is user-submitted.
The administrators of this site (kpaste.net) are not responsible for their content.
Abuse reports should be emailed to us at