JavaScript is not currently enabled, but is required for full CodeSonar manual search and browse functionality.
If you are viewing this file in your hub's Web GUI, enable JavaScript in your browser: you will also need it for GUI functionality.
If you opened this file directly from disk, your browser may be directly suppressing JavaScript functionality: certain browsers perform this suppression on local files (but not files delivered by web servers) for security reasons.
| CodeSonar® 9.0p0 Hot Tips | CONFIDENTIAL | CodeSecure Inc |
複数のスレッドが共有データにアクセスする場合で、別々にアクセスするための明示的な同期操作無しに、少なくとも1つのスレッドが共有データの値を変更しました。
CodeSonar はミューテックスロックの取得による、共有メモリアクセスの同期モデルを仮定して解析を行います。 (生産者/消費者モデルの様な)他の同期パターンを使うようなアプリケーションでは、 CodeSonar はデータ競合の誤検出を発生する可能性があります。
| クラス名 | Data Race | |||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 日本語クラス名 | データ競合 | |||||||||||||||||||||||||||||||||||||||||||||||||||
| クラス分類 | 信頼性 (reliability) | |||||||||||||||||||||||||||||||||||||||||||||||||||
| ニーモニック | CONCURRENCY.DATARACE | |||||||||||||||||||||||||||||||||||||||||||||||||||
| カテゴリー |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||
| 対応言語 | C および C++ で利用可能です。 |
|||||||||||||||||||||||||||||||||||||||||||||||||||
| 有効/無効設定 | このワーニングクラスのチェックはデフォルトで無効になっています。チェックを有効にするにはプロジェクト設定ファイル
(configuration file)に以下の WARNING_FILTER ルールを追加してください。
WARNING_FILTER += allow class="Data Race" |
以下のどちらかに該当する場合、関数 f() をスレッドエントリーポイントと認識します。
[オブジェクト指向のマルチスレッド API を使用するプログラムの場合のみ]
o がスレッドエントリーポイントを期待する箇所で使用され、m() が設定ファイルの THREAD_ENTRY_METHOD_NAMES と一致する場合に、オブジェクトメソッド
o.m() をスレッドエントリーポイントとみなします。
#include <pthread.h>
int count;
void update_count(){
int tmp = count; /* read without locking */
tmp = tmp+1;
count = tmp; /* 'Data Race' warning issued here */ /* write without locking */
}
void *watch_Y(void *arg){
while (1){
/* If see a yellow object, then... */
update_count();
/* Do yellow-specific tasks. */
}
}
void *watch_R(void *arg){
while (1){
/* If see a red object, then... */
update_count();
/* Do red-specific tasks. */
}
}
int main(void) {
pthread_t Y_pth, R_pth;
int y_res, r_res = 0;
int retval = 0;
y_res = pthread_create(&Y_pth, NULL, watch_Y, "yellow");
r_res = pthread_create(&R_pth, NULL, watch_R, "red");
/* ... */
if (!y_res)
pthread_detach(Y_pth);
if (!r_res)
pthread_detach(R_pth);
return y_res + r_res;
}
上記は update_count() 内でデータ競合が発生する可能性があります。
このワーニングクラスが有効の場合でも、 以下の箇所が存在しない場合はチェックしません。
設定パラメータ FORCE_THREAD_ENTRY_NAMES もしくは THREAD_ENTRY_METHOD_NAMES にて指定された関数は上記に含まれないので注意してください。
設定ファイルの以下のパラメータがこのワーニングクラスのチェックに影響します。