###前提・実現したいこと
明示的なバッファオーバーラン記述を見つけるための方法を知りたいと考えております。
###発生している問題・エラーメッセージ
コードの保守を行っているのですが、記述で明示的に
char buffer[5];
buffer[10] = 0x01;
...
と、ワーニングがでないコードを見つけたのですが、
ソース全体が同じ手法でコーディングされており、
ファイル数、行数の多さから目視で確認することを諦めました。
###試したこと
ルネサスのマイコンのソースで、HEW を利用しているのですが、
オプション等でワーニングを出せないか確認しているのですが、
見つけられませんでした。
###アドバイスをお願い致します。
何か別のツールでも、ソース解析ツールでも構いませんので、
このような明示的な記述ミスを洗い出す方法をご存知の方がいらっしゃいましたら
アドバイス頂けると助かります。
宜しくお願い致します。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答7件
2
ベストアンサー
静的解析ツールというのがあります。おそらく仕事で行われてることでしょうから、商用を含めこのようなツールの導入を検討してみてはいかがでしょうか。
オープンソースの物ではcppcheckやClang Static Analyzerがあります。
手元で確認したところ、質問者さんの例はClang Static Analyzerでは検出できませんでした。というか、Analyzerの前にclang自身が警告してくれます。
$ cat hoge.c int main(void) { char buffer[5]; buffer[10] = 0x01; } $ scan-build clang hoge.c scan-build: Using '/usr/bin/clang-3.9' for static analysis hoge.c:4:2: warning: array index 10 is past the end of the array (which contains 5 elements) [-Warray-bounds] buffer[10] = 0x01; ^ ~~ hoge.c:3:2: note: array 'buffer' declared here char buffer[5]; ^ 1 warning generated. scan-build: Removing directory '/tmp/scan-build-2017-02-21-150029-11072-1' because it contains no reports. scan-build: No bugs found.
cppcheckでは検出できるようです。
$ cat hoge.c int main(void) { char buffer[5]; buffer[10] = 0x01; } $ cppcheck hoge.c Checking hoge.c ... [hoge.c:4]: (error) Array 'buffer[5]' accessed at index 10, which is out of bounds.
商用のものではCoverityが有名です。以前組織で使っていましたが、これは・・・スゴイです。そしてお高いです。
投稿2017/02/21 06:05
総合スコア1151
2
私もHEWを使っていますが、そのような検出ができる設定は見当たりませんでした。
静的解析ツールの出番ですね。
フリーで使えそうなのはsplintでしょうか。
http://www.splint.org/
あとは市販製品ではESCRに準拠したチェックができるものがいくつかあります。
PGRelief
http://www.fujitsu.com/jp/group/fst/products/pgr/
C++ test
https://www.techmatrix.co.jp/product/ctest/staticanalysis/ipa_sec.html
参考まで。
投稿2017/02/21 05:44
総合スコア17000
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

2
何か別のツールでも、ソース解析ツールでも構いませんので、
他サイトの回答丸投げですが、以下に挙げられているものをいくつか実際に試してみるとよいかと思います。
静的コード解析ツールについて質問です。
投稿2017/02/21 05:38
総合スコア38352
1
他の方も紹介されていますが、個人的には cppcheckをよく使用しています。
基本的にはファイル単位のチェックとなり高度なチェックは出来ませんが、逆にコンパイルに必要なファイルが揃っていなくてもチェックが手軽に出来る点が逆に気に入っています。
Coverityなどは、コンパイル可能な状態にしないとチェックできないですが、他人の作成したファイルをレビューなどでチェックする場合など、コンパイル必要なファイルが揃っていない(揃ええるのが大変)という事がよくあるので。
ただし、cppcheck は日本語に対応できていないので、その点だけは注意が必要でです。
(ツールのメニューなどは日本語化されているのですが・・・)
投稿2017/02/21 12:51
総合スコア344
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

1
例に挙げられた様な静的なアクセス範囲違反であれば gcc の -Warray-bounds と -O2 を同時に指定すれば検出可能です。6行目に buffer[10] = 0x01; と同様のエラーがあるとわかります。
bash
1$ gcc -O2 -Warray-bounds main.c 2main.c: In function 'main': 3main.c:6: warning: array subscript is above array bounds 4
これに -Werror など付けて警告をエラーとして扱い全ての類似エラーが修正できるまでコンパイルできない様にするのも良いかもしれません。
投稿2017/02/21 08:07
総合スコア12
1
すでに出ていますが、静的コード解析ツールの利用をお勧めします。バッファオーバーランだけでなく、様々な「怪しい」記述の検出やコーディングルールの徹底など、うまく使えばとても有用です。無料で公開されているものもありますので、試してみると良いかもしれません。
もしVisual Studioをお使いなら、「コード分析」という名前で同様の機能が提供されています。
投稿2017/02/21 05:48
総合スコア5944
0
出せません。それはシンタックスエラーではないからです。
自分で注意するしかないですね。
このようなコードも書けるのがCの特徴でもありますね。
buffer[10] = 0x01;
これが
buffer[i] = 0x01;
こうなら、目視でも発見不可能ではないでしょうか。
どうしてもやるなら、配列を扱うのに関数を通せばできない事もないですね。
C
1char GetValue(int index) 2{ 3 assert(index < 10); 4 5 return buffer[index]; 6}
とか。
投稿2017/02/21 05:20
総合スコア1046
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/02/21 17:09
2017/02/21 17:24