CONC.DBL_LOCK
重大なリソースの複数のロック
CONC.DBL_LOCK チェッカーは、コードが特定のパスに沿って変数またはミューテックスを 2 回ロックしようとする場合にフラグを立てます。
脆弱性とリスク
コードが特定のパスに沿って変数またはミューテックスを 2 回ロックしようとすると、スレッドがハングする可能性があるか、あるいは未定義の動作が発生する場合があります。
軽減と防止
すでにロックされている場合は、必要な操作を実行した後に、リソースを必ずロック解除してください。
脆弱コード例
コピー
#include<pthread.h>
#include<stdio.h>
void foo(pthread_mutex_t mutex)
{
pthread_mutex_lock(&mutex);
pthread_mutex_lock(&mutex);
return;
}
int main()
{
pthread_mutex_t mutex;
if (pthread_mutex_init(&mutex, NULL) != 0) {
printf("\n mutex init has failed\n");
return 1;
}
foo(mutex);
return 0;
}
この準拠していない例では、コードは同じパスに沿って同じミューテックス (つまり、*mutex) を 2 回ロックしようとしているため、Klocwork は 7 行目で CONC.DBL_LOCK 欠陥を報告します。
修正コード例
コピー
#include<pthread.h>
#include<stdio.h>
void foo(pthread_mutex_t mutex)
{
pthread_mutex_lock(&mutex);
pthread_mutex_unlock(&mutex);
return;
}
int main()
{
pthread_mutex_t mutex;
if (pthread_mutex_init(&mutex, NULL) != 0) {
printf("\n mutex init has failed\n");
return 1;
}
foo(mutex);
return 0;
}
修正された例では、コードは特定のスレッドに沿ってミューテックスを適切にロックしてからロック解除しています。
セキュリティトレーニング
Secure Code Warrior が提供しているアプリケーションセキュリティトレーニング教材。