...
| Code Block | ||||
|---|---|---|---|---|
| ||||
pthread_mutexattr_t attr;
pthread_mutex_t mutex;
size_t const shared_var = 0;
int main(void) {
int result;
if ((result = pthread_mutexattr_init(&attr)) != 0) {
/* Handle Error */
}
if ((result = pthread_mutexattr_settype(&mutexattr, {{PTHREAD_MUTEX_NORMAL}})) != 0) {
/* Handle Error */
}
if ((result = pthread_mutex_init(&mutex, &attr)) != 0) {
/* Handle Error */
}
if ((result = pthread_mutex_lock(&mutex)) != 0) {
/* Handle Error */
}
/* Critical Region*/
if ((result = pthread_mutex_unlock(&mutex)) != 0) {
/* Handle Error */
}
return 0;
}
|
...
This compliant solution shows an ERRORCHECK mutex lock being created so that return codes will be available during locking and unlocking.:
| Code Block | ||||
|---|---|---|---|---|
| ||||
pthread_mutexattr_t attr;
pthread_mutex_t mutex;
size_t const shared_var = 0;
int main(void) {
int result;
if ((result = pthread_mutexattr_init(&attr)) != 0) {
/* Handle Error */
}
if ((result = pthread_mutexattr_settype(&mutexattr, PTHREAD_MUTEX_ERRORCHECK)) != 0) {
/* Handle Error */
}
if ((result = pthread_mutex_init(&mutex, &attr)) != 0) {
/* Handle Error */
}
if ((result = pthread_mutex_lock(&mutex)) != 0) {
/* Handle Error */
}
/* Critical Region*/
if ((result = pthread_mutex_unlock(&mutex)) != 0) {
/* Handle Error */
}
return 0;
}
|
...
Using NORMAL mutex locks can lead to deadlocks or abnormal program termination.
Recommendation | Severity | Likelihood |
|---|
Detectable | Repairable | Priority | Level |
|---|---|---|---|
POS04-C |
Low | Unlikely |
Yes |
Yes |
P2
L3
...
P3 | L3 |
Automated Detection
Tool | Version | Checker | Description | ||||||
|---|---|---|---|---|---|---|---|---|---|
| PC-lint Plus |
| 586 | Fully supported |
Bibliography
...