[adlint-user-ja:15] Re: [adlint-user-ja] グローバル変数について再び
Open source and free source code static analyzer
Brought to you by:
asamiogis
From: 高瀬竜一 <r-t...@ai...> - 2012-10-15 14:47:06
|
高瀬です. いつもお世話になっております. AdLint 2.4.10 にて,W9001の警告が出なくなったことを確認しました. 問題のご対応および詳細なご解説ありがとうございます. やはりグローバル変数の扱いが,なかなかに難しいようですね. 2012年10月15日 16:39 Yutaka Yanoh <ya...@us...>: > お世話になっております。矢野尾です。 > > ご報告ありがとうございます。 > 本件への対策を AdLint 2.4.10 に盛り込み、本日リリースいたしました。 > > 今回ご報告いただいたグローバル変数を含む制御式の問題ですが、前回掲示板にて > ご報告いただいた問題とは少し異なるものでした。 > > 今回の問題の詳細は下記のようになります。 > > ----- > if ((enable_cnt == 1) && (enable_win_cnt == 1)) > { /* (1) ブランチ開始時に enable_win_cnt 値の定義域を == 1 に限定 */ > enable_cnt = 0; > enable_win_cnt = 0; /* (2) == 1 だった定義域が == 0 に写像される */ > return; > } > /* (3) 制御式が複雑だったので、enable_win_cnt の定義域を元に戻そうとする > * が、定義域中の == 1 の部分が == 0 に写像されてしまっているので、 > * != 1 の任意の値ということになってしまった */ > > /* (4) enable_win_cnt 値の定義域は != 1 となってしまっているため、下記の > * 条件は常に偽になると誤判定してしまう */ > if ((enable_cnt == 2) && (enable_win_cnt == 1)) > > ----- > INT_MIN 0 1 INT_MAX > (1) のブランチに入らない場合の定義域 (A) [=============) (==========] > (1) のブランチに入る場合の定義域 (B) [ [=] ] > (2) の代入式で B を写像した定義域 (B') [ [=] ] > (3) で定義域 A と B' をマージ [=============) (==========] > ^^^ > ↑ == 1 が抜ける > ----- > > この問題を解決するために、 > > * ブランチを開始する際に、制御変数値の定義域をそれぞれ記録 > -> 上図の定義域 B を保存する > * return 文により終端するブランチの制御式が複雑すぎる場合は、ブランチを開 > 始するための定義域を間引かず、ブランチ開始時の定義域に戻す > -> 定義域 B' を B に戻す > > という対策を行いました。 > > ただし、前回のグローバル変数に関するご報告にて、今後の課題とさせていただい > た制約事項に加え、下記のような問題がまだ解決できておりません。 > > ----- > if (i == 0 && j == 0) { > .... > } > else if (i == 0) { > /* i != 0 に定義域が絞られているので、常に偽と評価してしまう */ > ... > } > ----- > > このケースについても、今後の課題とさせてください。 > > > しかし、今回の対策によりデータフロー解析に関するコードチェックが 2.4.6 より > 誤検知しにくくなるはずです。 > > お手数おかけしますが、AdLint 2.4.10 にアップデートしていただき、再度ご確認 > をお願いいたします。 > > -- > 矢野尾 裕 <ya...@us...> -------------------------------------------------------------------- 高瀬竜一 <r-t...@ai...> 独立行政法人 産業技術総合研究所 知能システム研究部門 タスクビジョン研究グループ -------------------------------------------------------------------- |