adlint-user-ja Mailing List for AdLint (Page 4)
Open source and free source code static analyzer
Brought to you by:
asamiogis
You can subscribe to this list here.
2012 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(33) |
Nov
(14) |
Dec
(3) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2013 |
Jan
|
Feb
(3) |
Mar
(1) |
Apr
(2) |
May
(15) |
Jun
(3) |
Jul
(4) |
Aug
(4) |
Sep
|
Oct
(5) |
Nov
|
Dec
|
2014 |
Jan
(1) |
Feb
(2) |
Mar
|
Apr
(1) |
May
(4) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2015 |
Jan
(2) |
Feb
|
Mar
(1) |
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2016 |
Jan
|
Feb
|
Mar
(1) |
Apr
(2) |
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: 高瀬竜一 <r-t...@ai...> - 2012-10-30 13:53:37
|
高瀬です. お世話になっております. ループの制御変数に対する警告について,1つ提案があります. 例として下記のコードを AdLint 2.6.0 で検査すると W0585 が出力されます. W,../forval.c,7,54,W0585,制御変数 `center' はインクリメント式に現れません。 ---------------------------------- #define RADIUS 10 int sum_numerical_sequence(const int center) { int x; int sum = 0; for (x = center - RADIUS; x <= (center + RADIUS); x++) { sum += x; } return sum; } ---------------------------------- この W0585 について利用者ガイドには 「ループ変数の増分を増分式で行わずにループ本体中で行うと...」 とありますが,変数 center は const で修飾されています. この場合,警告は出さないようにするのはいかがでしょうか. 以上です. -------------------------------------------------------------------- 高瀬竜一 <r-t...@ai...> 独立行政法人 産業技術総合研究所 知能システム研究部門 タスクビジョン研究グループ -------------------------------------------------------------------- |
From: 高瀬竜一 <r-t...@ai...> - 2012-10-29 15:17:08
|
高瀬です. いつもお世話になっております. AdLint 2.6.0 で,再び妙だと思われる警告に遭遇したのでご報告します. 下記のコードを検査すると,警告 W0599 が出力されます. W,../side.c,4,23,W0599,副作用完了点の間で `i' が変えられ、参照されています。評価順序は未定義です。 ------------------------------------------------ int getarea(const int x, const int y, const int z) { int i; for (i = 0; i < z; i++) { if (x < y) { return i; } } return 0; } ------------------------------------------------ この警告は「同一の変数が副作用完了点の間に 2 度以上アクセスされた場合、」との解説があります. しかしfor文やreturn文の式は完結式となり,副作用完了点となるようです. すると,変数 i の評価順序は未定義とはならないのではないでしょうか. 以上,取り急ぎご報告まで. -------------------------------------------------------------------- 高瀬竜一 <r-t...@ai...> 独立行政法人 産業技術総合研究所 知能システム研究部門 タスクビジョン研究グループ -------------------------------------------------------------------- |
From: 高瀬竜一 <r-t...@ai...> - 2012-10-28 10:26:51
|
高瀬です. いつもお世話になっております. 今度は AdLint 2.6.0 について要望が1つあります. それは次の W0719 の警告メッセージについてです. 「シフト演算子の右オペランドが、潜在型のビット幅以上の定数値です。」 このメッセージに,警告の原因となっている潜在型の型名を加えていただくことは可能でしょうか. コードを直す検討をするとき,まず潜在型がどれかを推測する必要があります. 潜在型を何ビット超えたのか,何ビットのシフトなら危険をはらまないかについて. しかし整数拡張や潜在型のルールがややこしく,調べるのに時間がかかります. メッセージと一緒に潜在型の型名も出力していただけると話が簡単になりますので. 以上,ご検討のほどよろしくお願いいたします. -------------------------------------------------------------------- 高瀬竜一 <r-t...@ai...> 独立行政法人 産業技術総合研究所 知能システム研究部門 タスクビジョン研究グループ -------------------------------------------------------------------- |
From: Yutaka Y. <ya...@us...> - 2012-10-25 06:54:03
|
矢野尾です。 ご提案ありがとうございます。 たしかに、すべての実行パスで該当変数への代入があるのに、未初期化と警告 するのは厳しすぎますね。 私としましては、案 1 が良いと思いました。 assert による事前条件の読み取りは今後ぜひ取り組みたいと思いますが、今 回の件では assert が無ければ現状どおりの動作となってしまうので。 そして、すみません! 前回のメールで「仕様通り」と書きましたが、n += (*val); のタイミングで n に未初期化状態が伝搬するのは AdLint の不具合でした。 ご提案していただいた、案 1 が本来の仕様でした。お手数おかけし大変申し 訳ありません。 この不具合は、+= などの複合代入式で代入する場合のみ発生します。 したがって、n += (*val); を n = n + (*val); に変更すると、W0460 警告は 出力されなくなります。 次回のリリースに本件の対応を盛り込む予定ですので、もうしばらくお待ちく ださい。 以上、いつもご報告ありがとうございます。 -- 矢野尾 裕 <ya...@us...> |
From: 高瀬竜一 <r-t...@ai...> - 2012-10-22 13:18:05
|
高瀬です. お世話になっております. 今回の件,個人的には少し厳しい警告かと思います. どう頑張ってもこの警告を避けられない状況があり得るでしょう. 対案としては2つほど思いつきます. 1. 単に,何であれ変数への代入があれば W0460 を出力しない 2. 代入前にassert文で *val の値の範囲が示されれば W0460 を出力しない 1はAdLintのチェックを緩くしますが,宣言時に未初期化の変数の方を検知できる可能性があり, 動的解析ツールを併用することでカバーできる可能性があるので目をつぶるというものです. (実際,今回の場合で *val が未初期化なら Valgrind 3.8.1 や Insure++ 7.1.8 で検知できるので) 2は,前の報告と同じソースコードのままなら W0460 を出力します. assert文を書き加え,*val の値の範囲が表明された後は初期化済みとし W0460 を出力しないという案です. 以前,掲示板でどなたかが W0705 の抑止にassert文の理由を提案されていましたが,応用がきくので有用だと思います. 参考までに.少し古いですが C++test 7.3 (MISRA2004, IPA rule) および Rational Software Analyzer 7.1.0 の静的解析では,今回のコードに対して W0460 に相当するような警告は出しませんでした. 以上です. 2012年10月21日 9:11 Yutaka Yanoh <ya...@us...>: > 矢野尾です。 > > ご報告ありがとうございます。 > > 結論から申し上げますと、AdLint 2.4.10 としては仕様通りの動作です。 > > val は仮引数なので、uninit 関数の解析時にどのような値が指定されるか不 > 明なため、ポインタ型の任意の値を取り得る、という前提で解析します。 > そして、同様に val をデリファレンスしたときの値も不明なため、int 型の > 任意の値を取り得る、という前提で解析します。 > > val と *val の両者とも「任意の値を取り得る」と書きましたが、AdLint で > の「任意の値」には下記の 2 種類があると考えています。 > > 1. 初期化はされているが値を決定できないので任意 > 2. そもそも初期化がされているかも不明なので任意 > > val は 1 にあたり、*val は 2 にあたります。 > > したがって、n += (*val); のタイミングで n に「初期化ができていないかも > 」という状態が伝搬するため W0460 警告を出力しています。 > > 現状の AdLint は、誤検知より検知漏れを嫌うポリシーにより、このような仕 > 様としています。 > > いかがでしょうか?実は自分としましても、実運用上ちょっとやりすぎかも? > とも感じております。。。 > 仕様をチューニングして、誤検知率と検知漏れ率のバランスをうまく取ってい > きたいと考えているのですが、ご意見をお聞かせ頂けると大変助かります。 > > 以上 > -------------------------------------------------------------------- 高瀬竜一 <r-t...@ai...> 独立行政法人 産業技術総合研究所 知能システム研究部門 タスクビジョン研究グループ -------------------------------------------------------------------- |
From: Yutaka Y. <ya...@us...> - 2012-10-22 08:01:27
|
矢野尾です。 申し訳ありません。先ほどのアナウンスメールに追記を忘れてました。 プロジェクトホームページの掲示板と adlint-user-ja メーリングリストへの お問い合わせの対応状況を下記のページにまとめておりますので、是非ご確認 ください。 http://adlint.sourceforge.net/pmwiki/pmwiki.php?n=Main.TicketList プロジェクトホームページのメニュー [サポート]-[不具合・改善の対応状況] に上記ページへのリンクを追加しました。 以上 -- 矢野尾 裕 <ya...@us...> > 矢野尾です。 > > 本日、AdLint 2.6.0 をリリースいたしました。 > > AdLint 2.4.10 からの変更点は下記の通りです。 > > * W0609/W0610 論理演算の結果が常に固定 コードチェックで、ループする > for 文の制御式について警告してしまう不具合を修正 > > * W0088 論理演算式の右辺に副作用が無い コードチェックで、単独の論理演 > 算式を含む式文だけではなく、for 文の制御式についても警告してしまう不 > 具合を修正 > > * W0723 符号付きの演算式がオーバーフローするかも コードチェックで、引 > き算の場合に正しくオーバーフローを検知できない不具合を修正 > > * 仮引数から他のオブジェクトへの変換可能性の判断で、仮引数が任意の型へ > のポインタ、変換先のオブジェクトが void ポインタの場合に、自然に変換 > できないと判断し W9003 暗黙的に異なる型のオブジェクトへ変換 警告を出 > 力してしまう不具合を修正 > > * typedef 型の文字列表現を変更し、警告メッセージとメトリクスで typedef > 型が表現するプリミティブな型名ではなく、typedef 型の識別子そのものを > 出力するよう仕様変更 > > * W9003 暗黙的に異なる型のオブジェクトへ変換 コードチェックで、警告メ > ッセージを明確にするため、変換元の型だけではなく変換先の型も出力する > よう仕様変更 > > 是非アップデートをお願いいたします。 > > -- > 矢野尾 裕 <ya...@us...> |
From: Yutaka Y. <ya...@us...> - 2012-10-22 07:51:28
|
矢野尾です。 本日、AdLint 2.6.0 をリリースいたしました。 AdLint 2.4.10 からの変更点は下記の通りです。 * W0609/W0610 論理演算の結果が常に固定 コードチェックで、ループする for 文の制御式について警告してしまう不具合を修正 * W0088 論理演算式の右辺に副作用が無い コードチェックで、単独の論理演 算式を含む式文だけではなく、for 文の制御式についても警告してしまう不 具合を修正 * W0723 符号付きの演算式がオーバーフローするかも コードチェックで、引 き算の場合に正しくオーバーフローを検知できない不具合を修正 * 仮引数から他のオブジェクトへの変換可能性の判断で、仮引数が任意の型へ のポインタ、変換先のオブジェクトが void ポインタの場合に、自然に変換 できないと判断し W9003 暗黙的に異なる型のオブジェクトへ変換 警告を出 力してしまう不具合を修正 * typedef 型の文字列表現を変更し、警告メッセージとメトリクスで typedef 型が表現するプリミティブな型名ではなく、typedef 型の識別子そのものを 出力するよう仕様変更 * W9003 暗黙的に異なる型のオブジェクトへ変換 コードチェックで、警告メ ッセージを明確にするため、変換元の型だけではなく変換先の型も出力する よう仕様変更 是非アップデートをお願いいたします。 -- 矢野尾 裕 <ya...@us...> |
From: Yutaka Y. <ya...@us...> - 2012-10-21 00:11:54
|
矢野尾です。 ご報告ありがとうございます。 結論から申し上げますと、AdLint 2.4.10 としては仕様通りの動作です。 val は仮引数なので、uninit 関数の解析時にどのような値が指定されるか不 明なため、ポインタ型の任意の値を取り得る、という前提で解析します。 そして、同様に val をデリファレンスしたときの値も不明なため、int 型の 任意の値を取り得る、という前提で解析します。 val と *val の両者とも「任意の値を取り得る」と書きましたが、AdLint で の「任意の値」には下記の 2 種類があると考えています。 1. 初期化はされているが値を決定できないので任意 2. そもそも初期化がされているかも不明なので任意 val は 1 にあたり、*val は 2 にあたります。 したがって、n += (*val); のタイミングで n に「初期化ができていないかも 」という状態が伝搬するため W0460 警告を出力しています。 現状の AdLint は、誤検知より検知漏れを嫌うポリシーにより、このような仕 様としています。 いかがでしょうか?実は自分としましても、実運用上ちょっとやりすぎかも? とも感じております。。。 仕様をチューニングして、誤検知率と検知漏れ率のバランスをうまく取ってい きたいと考えているのですが、ご意見をお聞かせ頂けると大変助かります。 以上 -- 矢野尾 裕 <ya...@us...> > 高瀬です. > いつもお世話になっております. > > AdLint 2.4.10 について,再び妙な警告に遭遇したのでご報告します. > 下記のコードは変数 n が確実に初期化されているはずですが, > return時に警告 W0460 で n が設定されていないとの警告が出ました. > > W,../uninit.c,9,10,W0460,変数 `n' の値は、この式の評価時点では設定されていな > いことがあります。 > > -------------------------------------- > #include <stdlib.h> > int uninit(const int * const val) > { > int n = 0; > if (val != NULL) > { > n += (*val); > } > return n; > } > -------------------------------------- > > > 取り急ぎご報告まで. > -------------------------------------------------------------------- > 高瀬竜一 <r-t...@ai...> > > 独立行政法人 産業技術総合研究所 > 知能システム研究部門 タスクビジョン研究グループ > -------------------------------------------------------------------- |
From: 高瀬竜一 <r-t...@ai...> - 2012-10-20 09:31:02
|
高瀬です. お世話になっております. AdLintの型変換の警告について一つ理由の分からないものが見つかりました. それは,下記のコードで発生するchar型からint型への暗黙の型変換です. short型は警告されませんが,なぜかchar型は次のように警告されます. W,../convert.c,6,8,W0123,暗黙的に char 型から int 型に型変換されています。 W,../convert.c,6,8,W0246,暗黙的に unsigned char 型から int 型に型変換されています。 W,../convert.c,6,14,W0123,暗黙的に char 型から int 型に型変換されています。 W,../convert.c,6,14,W0246,暗黙的に unsigned char 型から int 型に型変換されています。 ----------------------------------- void convert(const char a1, const char a2, const short b1, const short b2, const int c1, const int c2, const long d1, const long d2) { if ((a1 == a2) && (b1 == b2) && (c1 == c2) && (d1 == d2)) { } return; } ----------------------------------- 関係演算子のオペランドでの算術型変換に対する警告でしょうか. adlint_traits.ymlでは char, short ともに int とビット数が 異なりますが,なぜ short 型と扱いが違うのでしょう. AdLint 2.4.10とUbuntu 12.04(64bit)で確認しました. -------------------------------------------------------------------- 高瀬竜一 <r-t...@ai...> 独立行政法人 産業技術総合研究所 知能システム研究部門 タスクビジョン研究グループ -------------------------------------------------------------------- |
From: 高瀬竜一 <r-t...@ai...> - 2012-10-20 06:37:34
|
高瀬です. いつもお世話になっております. AdLint 2.4.10 について,再び妙な警告に遭遇したのでご報告します. 下記のコードは変数 n が確実に初期化されているはずですが, return時に警告 W0460 で n が設定されていないとの警告が出ました. W,../uninit.c,9,10,W0460,変数 `n' の値は、この式の評価時点では設定されていないことがあります。 -------------------------------------- #include <stdlib.h> int uninit(const int * const val) { int n = 0; if (val != NULL) { n += (*val); } return n; } -------------------------------------- 取り急ぎご報告まで. -------------------------------------------------------------------- 高瀬竜一 <r-t...@ai...> 独立行政法人 産業技術総合研究所 知能システム研究部門 タスクビジョン研究グループ -------------------------------------------------------------------- |
From: Rie S. <rka...@us...> - 2012-10-17 05:09:49
|
嶋@AdLintの開発者その2 です。 AdLint2.4.10 で、W0498の修正に合わせて、W0502の不具合の修正を行ったため、 本件も解決することができました。 いつも的確な不具合の指摘をいただきありがとうございます。 今後ともよろしくお願いいたします。 (2012/10/15 23:30), 高瀬竜一 wrote: > 高瀬です. > > 下記の件について AdLint 2.4.10 で再度試してみたところ, > 問題が再現しなくなりました. > > 以上,ご連絡まで. > > 2012年10月8日 9:43 高瀬竜一 <r-t...@ai...>: >> 高瀬です. >> お世話になっております. >> >> 配列の[]に囲まれた二項演算子に,AdLint 2.4.0 が気になる警告を出したのでご報告します. >> >> 警告メッセージには >> >> W0502,+ - * / % 以外の二項演算子が、異なる優先順位の二項演算子と共に使われています。`()' で結合を明確にすることを勧めます。 >> >> とあるのですが,該当箇所は下記のように二項演算子が[]に囲まれていて,()で明確にする必要性を感じませんでした. >> >> void draw(void) >> { >> int check[1] = { 0 }; >> while (check[0 + 0] == 0) >> { >> check[0]++; >> } >> return; >> } >> > > -------------------------------------------------------------------- > 高瀬竜一 <r-t...@ai...> > > 独立行政法人 産業技術総合研究所 > 知能システム研究部門 タスクビジョン研究グループ > -------------------------------------------------------------------- > > ------------------------------------------------------------------------------ > Don't let slow site performance ruin your business. Deploy New Relic APM > Deploy New Relic app performance management and know exactly > what is happening inside your Ruby, Python, PHP, Java, and .NET app > Try New Relic at no cost today and get our sweet Data Nerd shirt too! > http://p.sf.net/sfu/newrelic-dev2dev > _______________________________________________ > adlint-user-ja mailing list > adl...@li... > https://lists.sourceforge.net/lists/listinfo/adlint-user-ja > |
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...> 独立行政法人 産業技術総合研究所 知能システム研究部門 タスクビジョン研究グループ -------------------------------------------------------------------- |
From: 高瀬竜一 <r-t...@ai...> - 2012-10-15 14:31:04
|
高瀬です. 下記の件について AdLint 2.4.10 で再度試してみたところ, 問題が再現しなくなりました. 以上,ご連絡まで. 2012年10月8日 9:43 高瀬竜一 <r-t...@ai...>: > 高瀬です. > お世話になっております. > > 配列の[]に囲まれた二項演算子に,AdLint 2.4.0 が気になる警告を出したのでご報告します. > > 警告メッセージには > > W0502,+ - * / % 以外の二項演算子が、異なる優先順位の二項演算子と共に使われています。`()' で結合を明確にすることを勧めます。 > > とあるのですが,該当箇所は下記のように二項演算子が[]に囲まれていて,()で明確にする必要性を感じませんでした. > > void draw(void) > { > int check[1] = { 0 }; > while (check[0 + 0] == 0) > { > check[0]++; > } > return; > } > -------------------------------------------------------------------- 高瀬竜一 <r-t...@ai...> 独立行政法人 産業技術総合研究所 知能システム研究部門 タスクビジョン研究グループ -------------------------------------------------------------------- |
From: 高瀬竜一 <r-t...@ai...> - 2012-10-15 14:10:55
|
高瀬です. 問い合わせへのご回答ありがとうございます. AdLint 2.4.10 で問題が解消されたことを確認しました. 本件以外に,以前ご報告した「配列の[]に囲まれた二項演算子について」の方も,この改修で解消したようにみえます. 以上,取り急ぎ御礼まで. 2012年10月15日 16:42 Yutaka Yanoh <ya...@us...>: > 矢野尾です。 > > お待たせいたしました。 > 本件でご報告いただいた問題を対策し、AdLint 2.4.10 をリリースいたしました。 > > 本件の問題は、データフロー解析の根幹部分に原因があり、W0609/W0612 以外にも > さまざまなコードチェックについても問題を修正することができました。 > > お手数おかけしますが、AdLint 2.4.10 にアップデートしていただき、再度ご確認 > をお願いいたします。 > -------------------------------------------------------------------- 高瀬竜一 <r-t...@ai...> 独立行政法人 産業技術総合研究所 知能システム研究部門 タスクビジョン研究グループ -------------------------------------------------------------------- |
From: Yutaka Y. <ya...@us...> - 2012-10-15 07:55:48
|
矢野尾です。 本日、AdLint 2.4.10 をリリースいたしました。 今回のリリースでは、サポート掲示板とメーリングリストにご報告いただいた 不具合の修正を含む、下記 4 点の変更を実施いたしました。 * 制御式が複雑すぎるため制御変数値の定義域管理を諦めたブランチで、制御 変数値を更新した後に return 文により実行パスが終端した場合に、制御変 数値の定義域管理が不正となる不具合を修正 * 関数定義の評価後にグローバル変数に記録した副作用をロールバックしきれ ない不具合を修正 * sizeof 式オペランドの評価時に副作用を記録しないように修正 * W0488/W0489/W0490/W0495/W0496/W0497/W0498/W0499/W0500/W0501/W0502 式 の優先順位を明示する () が不足 コードチェックで、問題のある式全体が () でグループ化されている場合に警告しない不具合を修正 是非アップデートをお願いいたします。 -- 矢野尾 裕 <ya...@us...> |
From: Yutaka Y. <ya...@us...> - 2012-10-15 07:42:54
|
矢野尾です。 お待たせいたしました。 本件でご報告いただいた問題を対策し、AdLint 2.4.10 をリリースいたしました。 本件の問題は、データフロー解析の根幹部分に原因があり、W0609/W0612 以外にも さまざまなコードチェックについても問題を修正することができました。 お手数おかけしますが、AdLint 2.4.10 にアップデートしていただき、再度ご確認 をお願いいたします。 -- 矢野尾 裕 <ya...@us...> > 矢野尾です。 > > ご報告ありがとうございます。 > > 関数定義評価後にグローバル変数値に記録した副作用をロールバックする処理に > 不具合がありました。 > ちょうど開発チーム内でも先週同様の現象を確認しまして、明日(10/15)に対策 > 済みのバージョンをリリース予定です。 > > これはかなり重大な不具合で、ご迷惑おかけし申し訳ありません。 > > (2012年10月14日 05:26), 高瀬竜一 wrote: >> 高瀬です. >> お世話になっております. >> >> AdLint 2.4.6 を使用していて,おかしな警告に遭遇しました.下記のような同じ処理内容の関数が2つあり,なぜか片方の関数にだけ >> W0609 と W0612 が出ます. >> >> W,../align.c,31,19,W0609,この論理演算の結果は常に真になります。 >> W,../align.c,31,19,W0612,この if 条件式の値は常に真です。 >> >> 実際のコードは次の通りです. >> ----------------------------------------------------- >> #include<stdio.h> >> #include<stdlib.h> >> >> extern unsigned char *main_pixbuf; >> extern unsigned char *pixbuf_new(const int width, const int height); >> extern void pixbuf_unref(unsigned char *ref); >> extern void message_popup(void); >> >> void align_disp(const int width, const int height); >> void align_no(const int width, const int height); >> >> void >> align_disp(const int width, const int height) >> { >> if (main_pixbuf != NULL) >> { >> pixbuf_unref(main_pixbuf); >> } >> main_pixbuf = pixbuf_new(width, height); >> if (main_pixbuf == NULL) >> { >> message_popup(); >> return; /* XXX */ >> } >> return; >> } >> >> void >> align_no(const int width, const int height) >> { >> if (main_pixbuf != NULL) >> { >> pixbuf_unref(main_pixbuf); >> } >> main_pixbuf = pixbuf_new(width, height); >> if (main_pixbuf == NULL) >> { >> message_popup(); >> return; /* XXX */ >> } >> return; >> } >> ----------------------------------------------------- >> 警告 W0609, W0612 が出るのは関数 align_no の方の1番目の if 文です. >> >> 不思議なことに無関係そうな XXX の行の return 文を消すと警告が出ないようです. >> >> 取り急ぎご報告まで. >> -------------------------------------------------------------------- >> 高瀬竜一<r-t...@ai...> >> >> 独立行政法人 産業技術総合研究所 >> 知能システム研究部門 タスクビジョン研究グループ >> -------------------------------------------------------------------- |
From: Yutaka Y. <ya...@us...> - 2012-10-15 07:39:39
|
お世話になっております。矢野尾です。 ご報告ありがとうございます。 本件への対策を 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...> > 高瀬@産総研です. > いつもお世話になっております. > > AdLint 2.4 についてご報告です. > 以前対応していただいた警告が再び出てしまいました. > > グローバル変数について,以前と似て異なる状況で > デッドコードでない箇所が次のように警告されました. > > W,../destroy.c,16,5,W9001,この文には制御が到達しません。 > > ------- > #include <stdio.h> > #include "global.h" > > void > destroy(void) > { > if ((enable_cnt == 1) && (enable_win_cnt == 1)) > { > enable_cnt = 0; > enable_win_cnt = 0; > return; > } > > if ((enable_cnt == 2) && (enable_win_cnt == 1)) > { > printf("PASS\n"); > } > return; > } > ------- > > 問題のソース一式を添付します. > > 以上,取り急ぎご連絡まで. > -------------------------------------------------------------------- > 高瀬竜一 <r-t...@ai...> > > 独立行政法人 産業技術総合研究所 > 知能システム研究部門 タスクビジョン研究グループ > -------------------------------------------------------------------- |
From: Yutaka Y. <ya...@us...> - 2012-10-13 20:53:43
|
矢野尾です。 ご報告ありがとうございます。 関数定義評価後にグローバル変数値に記録した副作用をロールバックする処理に 不具合がありました。 ちょうど開発チーム内でも先週同様の現象を確認しまして、明日(10/15)に対策 済みのバージョンをリリース予定です。 これはかなり重大な不具合で、ご迷惑おかけし申し訳ありません。 (2012年10月14日 05:26), 高瀬竜一 wrote: > 高瀬です. > お世話になっております. > > AdLint 2.4.6 を使用していて,おかしな警告に遭遇しました.下記のような同じ処理内容の関数が2つあり,なぜか片方の関数にだけ > W0609 と W0612 が出ます. > > W,../align.c,31,19,W0609,この論理演算の結果は常に真になります。 > W,../align.c,31,19,W0612,この if 条件式の値は常に真です。 > > 実際のコードは次の通りです. > ----------------------------------------------------- > #include<stdio.h> > #include<stdlib.h> > > extern unsigned char *main_pixbuf; > extern unsigned char *pixbuf_new(const int width, const int height); > extern void pixbuf_unref(unsigned char *ref); > extern void message_popup(void); > > void align_disp(const int width, const int height); > void align_no(const int width, const int height); > > void > align_disp(const int width, const int height) > { > if (main_pixbuf != NULL) > { > pixbuf_unref(main_pixbuf); > } > main_pixbuf = pixbuf_new(width, height); > if (main_pixbuf == NULL) > { > message_popup(); > return; /* XXX */ > } > return; > } > > void > align_no(const int width, const int height) > { > if (main_pixbuf != NULL) > { > pixbuf_unref(main_pixbuf); > } > main_pixbuf = pixbuf_new(width, height); > if (main_pixbuf == NULL) > { > message_popup(); > return; /* XXX */ > } > return; > } > ----------------------------------------------------- > 警告 W0609, W0612 が出るのは関数 align_no の方の1番目の if 文です. > > 不思議なことに無関係そうな XXX の行の return 文を消すと警告が出ないようです. > > 取り急ぎご報告まで. > -------------------------------------------------------------------- > 高瀬竜一<r-t...@ai...> > > 独立行政法人 産業技術総合研究所 > 知能システム研究部門 タスクビジョン研究グループ > -------------------------------------------------------------------- > > ------------------------------------------------------------------------------ > Don't let slow site performance ruin your business. Deploy New Relic APM > Deploy New Relic app performance management and know exactly > what is happening inside your Ruby, Python, PHP, Java, and .NET app > Try New Relic at no cost today and get our sweet Data Nerd shirt too! > http://p.sf.net/sfu/newrelic-dev2dev > _______________________________________________ > adlint-user-ja mailing list > adl...@li... > https://lists.sourceforge.net/lists/listinfo/adlint-user-ja |
From: 高瀬竜一 <r-t...@ai...> - 2012-10-13 20:26:51
|
高瀬です. お世話になっております. AdLint 2.4.6 を使用していて,おかしな警告に遭遇しました.下記のような同じ処理内容の関数が2つあり,なぜか片方の関数にだけ W0609 と W0612 が出ます. W,../align.c,31,19,W0609,この論理演算の結果は常に真になります。 W,../align.c,31,19,W0612,この if 条件式の値は常に真です。 実際のコードは次の通りです. ----------------------------------------------------- #include <stdio.h> #include <stdlib.h> extern unsigned char *main_pixbuf; extern unsigned char *pixbuf_new(const int width, const int height); extern void pixbuf_unref(unsigned char *ref); extern void message_popup(void); void align_disp(const int width, const int height); void align_no(const int width, const int height); void align_disp(const int width, const int height) { if (main_pixbuf != NULL) { pixbuf_unref(main_pixbuf); } main_pixbuf = pixbuf_new(width, height); if (main_pixbuf == NULL) { message_popup(); return; /* XXX */ } return; } void align_no(const int width, const int height) { if (main_pixbuf != NULL) { pixbuf_unref(main_pixbuf); } main_pixbuf = pixbuf_new(width, height); if (main_pixbuf == NULL) { message_popup(); return; /* XXX */ } return; } ----------------------------------------------------- 警告 W0609, W0612 が出るのは関数 align_no の方の1番目の if 文です. 不思議なことに無関係そうな XXX の行の return 文を消すと警告が出ないようです. 取り急ぎご報告まで. -------------------------------------------------------------------- 高瀬竜一 <r-t...@ai...> 独立行政法人 産業技術総合研究所 知能システム研究部門 タスクビジョン研究グループ -------------------------------------------------------------------- |
From: Yutaka Y. <ya...@us...> - 2012-10-09 05:51:17
|
矢野尾です。 申し訳ありません。 先ほどのアナウンスメール中の URL に間違いがありましたので、訂正いたします。 * NULLになることがあるポインタの警告 http://sf.net/p/adlint/discussion/support_ja/thread/b0f28cf1/ * printfでのconstの扱い http://sf.net/p/adlint/discussion/support_ja/thread/7ee41206/ 以上 -- 矢野尾 裕 <ya...@us...> |
From: Yutaka Y. <ya...@us...> - 2012-10-09 05:44:28
|
矢野尾です。 本日、AdLint 2.4.6 をリリースいたしました。 今回のリリースでは、サポート掲示板にてご報告いただいた下記の不具合につ いて対応いたしました。 * NULLになることがあるポインタの警告 http://sf.net/p/adlint/discussion/support_ja/thread/b0f28cf1/ * printfでのconstの扱い http://df.net/p/adlint/discussion/support_ja/thread/7ee41206/ 是非アップデートをお願いいたします。 -- 矢野尾 裕 <ya...@us...> |
From: 高瀬竜一 <r-t...@ai...> - 2012-10-08 00:44:06
|
高瀬です. お世話になっております. 配列の[]に囲まれた二項演算子に,AdLint 2.4.0 が気になる警告を出したのでご報告します. 警告メッセージには W0502,+ - * / % 以外の二項演算子が、異なる優先順位の二項演算子と共に使われています。`()' で結合を明確にすることを勧めます。 とあるのですが,該当箇所は下記のように二項演算子が[]に囲まれていて,()で明確にする必要性を感じませんでした. void draw(void) { int check[1] = { 0 }; while (check[0 + 0] == 0) { check[0]++; } return; } 以上です. -------------------------------------------------------------------- 高瀬竜一 <r-t...@ai...> 独立行政法人 産業技術総合研究所 知能システム研究部門 タスクビジョン研究グループ -------------------------------------------------------------------- |
From: 高瀬竜一 <r-t...@ai...> - 2012-10-05 14:19:59
|
高瀬です. お世話になっております. AdLint 2.4.0 について1つ要望です. 16進整数リテラルがマクロのとき,警告 W0076 が数値を書いた行を指すようにしてはいかがでしょうか. 具体的には次のようなソースコードがあったとき ---------- #define NAME1 0xBE00 #define NAME2 NAME1 static const int name1 = NAME1; static const int name2 = NAME2; ---------- 次の警告が出ます. W,../digit.c,3,26,W0076,この 16 進整数リテラルには、接尾語 `U' または `u' が付けられていません。 W,../digit.c,4,26,W0076,この 16 進整数リテラルには、接尾語 `U' または `u' が付けられていません。 この警告は1行目に対して,ただ一度だけ出る方が望ましいと思います. NAME1とNAME2が別々のヘッダファイルに散らばっている場合などは特に. 以上です. -------------------------------------------------------------------- 高瀬竜一 <r-t...@ai...> 独立行政法人 産業技術総合研究所 知能システム研究部門 タスクビジョン研究グループ -------------------------------------------------------------------- |
From: 高瀬竜一 <r-t...@ai...> - 2012-10-04 13:29:38
|
高瀬@産総研です. いつもお世話になっております. AdLint 2.4 についてご報告です. 以前対応していただいた警告が再び出てしまいました. グローバル変数について,以前と似て異なる状況で デッドコードでない箇所が次のように警告されました. W,../destroy.c,16,5,W9001,この文には制御が到達しません。 ------- #include <stdio.h> #include "global.h" void destroy(void) { if ((enable_cnt == 1) && (enable_win_cnt == 1)) { enable_cnt = 0; enable_win_cnt = 0; return; } if ((enable_cnt == 2) && (enable_win_cnt == 1)) { printf("PASS\n"); } return; } ------- 問題のソース一式を添付します. 以上,取り急ぎご連絡まで. -------------------------------------------------------------------- 高瀬竜一 <r-t...@ai...> 独立行政法人 産業技術総合研究所 知能システム研究部門 タスクビジョン研究グループ -------------------------------------------------------------------- |
From: Yutaka Y. <ya...@us...> - 2012-10-01 15:33:13
|
テスト #2 -- 矢野尾 裕 <ya...@us...> |