
...
Code Block | ||||
---|---|---|---|---|
| ||||
#include <threads.h> #include <stdlib.h> /* Global key to the thread-specific storage */ tss_t key; enum { MAX_THREADS = 3 }; /* ... Other functions are unchanged */ void destructor(void *data) { free(data); } int main(void) { thrd_t thread_id[MAX_THREADS]; /* Create the key before creating the threads */ if (thrd_success != tss_create(&key, destructor)) { /* Handle error */ } /* Create threads that would store specific storage */ for (size_t i = 0; i < MAX_THREADS; i++) { if (thrd_success != thrd_create(&thread_id[i], function, NULL)) { /* Handle error */ } } for (size_t i = 0; i < MAX_THREADS; i++) { if (thrd_success != thrd_join(thread_id[i], NULL)) { /* Handle error */ } } tss_delete(key); return 0; } |
Defect Report #416 states that "the standard does not specify if or when destructors for thread-specific data keys (created with the tss_create
function) are invoked." The key observation from WG14 committee discussion concerns the deliberate underspecification of threads to allow the greatest opportunity for implementation on a variety of operating systems. Consequently, it is important to consult the documentation for the specific implementation before adopting this or similar solutions using destructors for thread-specific data keys.
Risk Assessment
Failing to free thread-specific objects results in memory leaks and could result in a denial-of-service attack.
Rule | Severity | Likelihood | Detectable |
---|
Repairable | Priority | Level |
---|---|---|
CON30-C | Medium | Unlikely |
No | No |
P4
L3
P2 | L3 |
Automated Detection
Tool | Version | Checker | Description | ||||||
---|---|---|---|---|---|---|---|---|---|
Astrée |
| Supported, but no explicit checker | |||||||
CodeSonar |
| ALLOC.LEAK | Leak | ||||||
Coverity |
| ALLOC_FREE_MISMATCH | Partially implemented, correct implementation is more involved | ||||||
Cppcheck Premium |
| premium-cert-con30-c | |||||||
Helix QAC |
| C1780, C1781, C1782, C1783, C1784 | |||||||
Parasoft C/C++test |
| CERT_C-CON30-a | Ensure resources are freed | ||||||
| CERT C: Rule CON30-C | Checks for thread-specific memory leak (rule fully covered) |
Related Vulnerabilities
Search for vulnerabilities resulting from the violation of this rule on the CERT website.
...