...
Code Block |
---|
|
#include <signal.h>
#include <stdlib.h>
#include <string.h>
char *err_msg;
volatile sig_atomic_t e_flag = 0;
void handler(int signum) {
signal(signum, handler);
e_flag = 1;
}
int main(void) {
signal(SIGINT, handler);
err_msg = (char *)malloc(24);
if (err_msg == NULL) {
/* handle error condition */
}
strcpy(err_msg, "No errors yet.");
/* main code loop */
if (e_flag) {
strcpy(err_msg, "SIGINT received.");
}
return 0;
}
|
Compliant Solution
To be safe, signal handlers should only unconditionally set a flag of type volatile sig_atomic_t
and returnThe compliant solution does not reference errno
.
Code Block |
---|
|
#include <signal.h>
#include <stdlib.h>
#include <string.h>
typedef void (*pfv)(int);
char *err_msg;
void handler(int signum) {
pfv old_handler = signal(signum, handler);
if (old_handler == SIG_ERR) {
perror("SIGINT handler"); /* undefined behavior */
/* handle error condition */
}
strcpy(err_msg, "SIGINT encountered.");
}
int main(void) {
pfv old_handler = signal(SIGINT, handler);
if (old_handler == SIG_ERR) {
perror("SIGINT handler");
/* handle error condition */
}
err_msg = (char *)malloc(24);
if (err_msg == NULL) {
/* handle error condition */
}
strcpy(err_msg, "No errors yet.");
/* main code loop */
return 0;
}
|
...