You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 23 Next »

The C Standard, 7.26.5.6 [ISO/IEC 9899:2011], states that a thread shall not be joined once it was previously joined or detached. Similarly, subclause 7.26.5.3 states that a thread shall not be detached once it was previously joined or detached. Violating either of these subclauses results in undefined behavior.

Noncompliant Code Example

This noncompliant code example detaches a thread that is later joined.

#include <stddef.h>
#include <threads.h>
 
int thread_func(void *arg) {
  /* Do work */
  thrd_detach(thrd_current());
  return 0;
}

int main(void) {
  thrd_t t;

  if (thrd_success != thrd_create(&t, thread_func, NULL)) {
    /* Handle error */
    return 0;
  }

  if (thrd_success != thrd_join(t, 0)) {
    /* Handle error */
    return 0;
  }
  return 0;
}

Compliant Solution

 This compliant solution does not detach the thread. Its resources are released upon successfully joining with the main thread:

#include <stddef.h>
#include <threads.h>
  
int thread_func(void *arg) {
  /* Do work */
  return 0;
}

int main(void) {
  thrd_t t;

  if (thrd_success != thrd_create(&t, thread_func, NULL)) {
    /* Handle error */
    return 0;
  }

  if (thrd_success != thrd_join(t, 0)) {
    /* Handle error */
    return 0;
  }
  return 0;
} 

Risk Assessment

Joining or detaching a previously joined or detached thread is undefined behavior.

Rule

Severity

Likelihood

Remediation Cost

Priority

Level

CON39-C

Low

Likely

Medium

P6

L2

Automated Detection

Tool

Version

Checker

Description

Astrée24.04 Supported, but no explicit checker

Related Vulnerabilities

Search for vulnerabilities resulting from the violation of this rule on the CERT website.

Bibliography

[ISO/IEC 9899:2011]

Subclause 7.26.5.3, "The thrd_detach Function"
Subclause 7.26.5.6, "The thrd_join Function"

 


  • No labels