Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: rule is now separate from POS44-C

Do not use the signal() function in a multithreaded program. This is undefined behavior in C11 (Section 7.14.1.1, paragraph 7).

This rule is a specific instance of SIG02-C. Avoid using signals to implement normal functionality.

Noncompliant Code Example

This code raises a signal within a child thread. This is meant to terminate the program, but results in undefined behavior.

Code Block
bgColor#ffcccc
langc
void func(void *data) {
  /* ... */
  if (thread_should_exit) {
    raise( SIGTERM);  // Undefined!
  }
  /* ... */
}

int main(void) {
  int result;
  thrd_t thread;
 
  int result;
  if ((result = thrd_create(&tid, func, NULL)) != thrd_success) {
    /* Handle Error */
  }
  return 0;
}

Compliant Solution

This code terminates the child thread rather than raising a signal. This has the same effect as the noncompliant code example, but is well-defined in C11.

Code Block
bgColor#ccccff
langc
void func(void *data) {
  /* ... */
  if (thread_should_exit) {
    thrd_exit(0);  // OK
  }
  /* ... */
}
int main(void) {
  int result;
  thrd_t thread;
 
  int result;
  if ((result = thrd_create(&tid, func, NULL)) != thrd_success) {
    /* Handle Error */
  }
  return 0;
}

Risk Assessment

Mixing signals and threads causes undefined behavior.

Rule

Severity

Likelihood

Remediation Cost

Priority

Level

CON37-C

low

probable

low

P6

L2

Bibliography

[ISO/IEC 9899:2011]