質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

7回答

8994閲覧

C言語で明示的なバッファオーバーラン記述を見つける方法について

GuielNo4

総合スコア88

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

1グッド

3クリップ

投稿2017/02/21 04:52

###前提・実現したいこと
明示的なバッファオーバーラン記述を見つけるための方法を知りたいと考えております。

###発生している問題・エラーメッセージ
コードの保守を行っているのですが、記述で明示的に
char buffer[5];
buffer[10] = 0x01;
...
と、ワーニングがでないコードを見つけたのですが、
ソース全体が同じ手法でコーディングされており、
ファイル数、行数の多さから目視で確認することを諦めました。

###試したこと
ルネサスのマイコンのソースで、HEW を利用しているのですが、
オプション等でワーニングを出せないか確認しているのですが、
見つけられませんでした。

###アドバイスをお願い致します。
何か別のツールでも、ソース解析ツールでも構いませんので、
このような明示的な記述ミスを洗い出す方法をご存知の方がいらっしゃいましたら
アドバイス頂けると助かります。

宜しくお願い致します。

can110👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答7

0

ベストアンサー

静的解析ツールというのがあります。おそらく仕事で行われてることでしょうから、商用を含めこのようなツールの導入を検討してみてはいかがでしょうか。

オープンソースの物ではcppcheckClang 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

sharow

総合スコア1149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

GuielNo4

2017/02/21 17:09

早速利用致しました。 望んでいた解析に一番近いことが出来ました。 アドバイス有難うございました。
GuielNo4

2017/02/21 17:24

解析結果として [main.c:9]: (error) Array 'buffer[5]' accessed at index 10, which is out of bounds. 以上の内容が表示されました。 今回の分析にはこのツールを利用させて頂こうと思います。 ありがとうございました。
guest

0

私も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

ttyp03

総合スコア16996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

GuielNo4

2017/02/21 08:09

HEWの情報有難うございます。大変助かります。 まず、splint を試してみたいと思います。 アドバイス有難うございました。
guest

0

何か別のツールでも、ソース解析ツールでも構いませんので、

他サイトの回答丸投げですが、以下に挙げられているものをいくつか実際に試してみるとよいかと思います。
静的コード解析ツールについて質問です。

投稿2017/02/21 05:38

can110

総合スコア38233

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

GuielNo4

2017/02/21 08:06

ツールの御紹介ありがとうございます。 大変助かります。 記載のあるツールを調べて試してみたいと思います。 アドバイス有難うございました。
guest

0

他の方も紹介されていますが、個人的には cppcheckをよく使用しています。

基本的にはファイル単位のチェックとなり高度なチェックは出来ませんが、逆にコンパイルに必要なファイルが揃っていなくてもチェックが手軽に出来る点が逆に気に入っています。

Coverityなどは、コンパイル可能な状態にしないとチェックできないですが、他人の作成したファイルをレビューなどでチェックする場合など、コンパイル必要なファイルが揃っていない(揃ええるのが大変)という事がよくあるので。

ただし、cppcheck は日本語に対応できていないので、その点だけは注意が必要でです。
(ツールのメニューなどは日本語化されているのですが・・・)

ご参考:CppCheck 1.61 のWindows日本語パス対応

投稿2017/02/21 12:51

KenjiToriumi

総合スコア344

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

GuielNo4

2017/02/21 17:18

アドバイス有難うございます。 日本語対応の情報有難うございました。
KenjiToriumi

2017/02/22 10:36 編集

マルチバイト文字に対応できていないための、いわゆる「 SJIS の\(0x5C)問題」なので、「ソースコードはEUCコード(※1)に変換」、「ファイルの存在するディレクトリ(フルパス)をASCII文字のディレクトリに移動する」などすれば、ツール本体を改造しなくても対応できます。(なのでWindowsで問題になってLinuxだと問題になりにくい) 「ソ」が問題となる対象文字なので、ディレクトリ名などで「xxxのソース」なんてフォルダに置いてあってよくハマります。 ソースコード自体の文字コードについては、SJISのままでも、問題文字が含まれる対象個所の部分だけにチェックミスが限定され、他の部分のチェックは正常に行える事ががほとんどなので、SJISコードのソースだからチェックは出来ないという事はありません。 ※1 UTF-8などへの変換でも「\(0x5C)問題」自体は回避できますが、SJIS->UTF8だと文字列のバイト数が変化してしまい、strcpyやsprintfにおけるバッファオーバーランチェック時などで間違ったチェック結果になる事になるので、文字列のバイト数の変化しないSJIS->EUC変換が有効な対処となります。
GuielNo4

2017/02/22 04:13

リポジトリとの絡みもありますので UTF-8 で済ませたいところですが、 マイコンのファームだとコンパイラがUTFに対応していないこともあったりして、 対象ソースの多くがSJISだったりしますので、ぜひこの情報を生かして作業を行いたいと思います。 マルチバイト文字の情報ありがとうございました。
guest

0

例に挙げられた様な静的なアクセス範囲違反であれば 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

ktitt27

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

GuielNo4

2017/02/21 17:14

アドバイス有難うございます。 コンパイラオプションの情報有難うございました。
guest

0

すでに出ていますが、静的コード解析ツールの利用をお勧めします。バッファオーバーランだけでなく、様々な「怪しい」記述の検出やコーディングルールの徹底など、うまく使えばとても有用です。無料で公開されているものもありますので、試してみると良いかもしれません。

もしVisual Studioをお使いなら、「コード分析」という名前で同様の機能が提供されています。

投稿2017/02/21 05:48

catsforepaw

総合スコア5938

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

GuielNo4

2017/02/21 17:05

アドバイス有難うございます。 これを機に解析ツールをいろいろ調べてみたいと思います。
guest

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

mugicya

総合スコア1046

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

GuielNo4

2017/02/21 07:56

アドバイス有難うございます。 確かにご指摘の通り、変数で配列を変更する場合は検出できないですね… c#を勉強していまして、勉強がてら、 全ての変数をピックアップしてカッコ内の数値と変数名コレクションして、 コード上にアサートを入れて、コンパイルでワーニングが出るようにソースを加工するプログラムを組んでみて、他の方にアドバイス頂きました解析ツールの結果と比較してみようと思います。 アドバイス有難うございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問