Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

In this noncompliant code example, if the given user input is 0, the division operation sends a SIGFPE signal to the program.

Code Block
bgColor#ffcccc
langc
#include<signal.h>
#include<stddef.h>
#include<stdlib.h>

volatile sig_atomic_t denom;

void sighandle(int s){
  /* Fix the offending volatile */
  if (denom == 0) {
    denom = 1;
  }
  /* Everything is ok */
  return;
}

int main(int argc, char *argv[]){
  int result = 0;
    
  if (argc < 2) {
    return 0;
  }
  denom = (int)strtol(argv[1], (char **)NULL, 10);
    
  signal(SIGFPE,(*sighandle));

  result = 100/denom;
  return 0;
}

...

In the compliant solution, the only portably safe way to leave a SIGFPE, SIGILL, or SIGSEGV handler is through abort() or /_Exit(). In the case of SIGFPE, the default handler calls abort(), so no user-defined handler is actually needed. The handler shown is only for consistency.

Code Block
bgColor#ccccff
langc
#include<signal.h>
#include<stddef.h>
#include<stdlib.h>

volatile sig_atomic_t denom;

void sighandle(int s){
  /* No recovery */
  abort();
}

int main(int argc, char *argv[]){
  int result = 0;
    
  if (argc < 2) {
    return 0;
  }
  denom = (int)strtol(argv[1], (char **)NULL, 10);
    
  signal(SIGFPE,(*sighandle));

  result = 100/denom;
  return 0;
}

...