The C Standard, subclause 7.2628.5.6 paragraph 2 [ISO/IEC 9899:20112024], specifically states that a thread shall not be joined once it was previously joined or detached. Similarly, in
The termination of the other thread synchronizes with the completion of the thrd_join function. The thread identified by thr shall not have been previously detached or joined with another thread.
Similarly, subclause 7.2628.5.3 , it states that a paragraph 2 [ISO/IEC 9899:2024], states that a thread shall not be detached once it was previously joined or detached.
The thrd_detach function tells the operating system to dispose of any resources allocated to the thread identified by thr when that thread terminates. The thread identified by thr shall not have been previously detached or joined with another thread.
Violating either of these subclauses results in undefined behavior 211.
Noncompliant Code Example
The following code example exhibits undefined behavior by detaching This noncompliant code example detaches a thread that is later joined. Performing this action can lead to undefined behavior.
| Code Block | ||||
|---|---|---|---|---|
| ||||
#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, 0NULL)) { /* Handle error */ return 0; } if (thrd_success != thrd_join(t, 0)) { /* Handle error */ return 0; } return 0; } |
Compliant Solution
In this This compliant solution , does not detach the thread is not detached. Its resources are released upon successfully joining with the main thread.:
| Code Block | ||||
|---|---|---|---|---|
| ||||
#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, 0NULL)) { /* 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 causes is undefined behavior 211.
Rule | Severity | Likelihood | Detectable |
|---|
Repairable | Priority | Level |
|---|
CON41-C
low
likely
low
P9
CON39-C | Low | Likely | No | No | P3 | L3 |
Automated Detection
Tool | Version | Checker | Description | ||||||
|---|---|---|---|---|---|---|---|---|---|
| Astrée |
| Supported, but no explicit checker | |||||||
| CodeSonar |
| CONCURRENCY.TNJ | Thread is not Joinable | ||||||
| Cppcheck Premium |
| premium-cert-con39-c | |||||||
| Helix QAC |
| C1776 | |||||||
| Parasoft C/C++test |
| CERT_C-CON39-a | Do not join or detach a thread that was previously joined or detached | ||||||
| Polyspace Bug Finder |
| CERT C: Rule CON39-C | Checks for join or detach of a joined or detached thread (rule fully covered) |
Related Vulnerabilities
Search for vulnerabilities resulting from the violation of this rule on the CERT website.
Bibliography
| [ISO/IEC 9899: |
| 2024] |
Subclause 7. |
28.5.3, " |
The |
Function" |
Subclause 7. |
28.5.6, " |
The |
Function" |
...
...