

C(C++、C#)ソースコード静的解析ツールの検証項目について、先輩諸氏の知見を拝借します。

静的解析は、次の2つの観点があると思います。

  1. 実行文としての構文解析
  2. コーディングフォーマットとしての構文解析(コメント、インデントなども含めた)

これらの「構文解析」の具体的な検証項目について、参考書籍などありましたら教えてください。


CC BY-SA 3.0
2015-03-26T12:58:58.013
8441
2015-08-22T10:13:39.297
2015-03-28T00:55:40.953
3068
9035
question
c
静的解析(Static Analysys)の参考書籍について


経験者ではないが失礼します。  
静的解析は色々なプログラミング言語に沢山ありますので、  
一番いい方法はそのツールのHPを参加することだと思います。  
ですが、一般的に「静的解析」を知りたいのなら[この  
本](http://www.amazon.co.jp/Programming-Analysis-Addison-Wesley-Software-
Security/dp/toc/0321424778)をおすすめです（英語ですけど。。。）


CC BY-SA 3.0
2015-03-26T15:35:49.633
8447
2015-03-26T15:35:49.633
9038
8441
answer


既にコメントにもあるけど、静的解析ってのは構文解析することではないので何が訊きたいのか良くわからないです。  
構文解析ならコンパイルのたびに毎回行われるわけで。

私が思うところの静的解析ってのはたとえば

  * 変数の値を、設定しないまま使う経路があるかどうかをチェックする
  * 絶対に通過しない行があるかどうかチェックする
  * 意味の無い比較をしているかチェックする (unsigned < 0 は絶対に成立しない)
  * 移植性の低い (他の処理系に移植すると挙動が変わりうる) コードをチェックする
  * タイプミスではないか？を検出する (Ｃで `if (x=0)` はたぶんタイプミス)

などなどの「バグっぽいコードを実行する前に検出する」ことです。

で、この静的解析の一例として C なら MISRA <http://ja.wikipedia.org/wiki/MISRA-C> とかが該当しますし  
(個人的には MISRA-C は使う気がしませんけど)  
他にも lint <http://ja.wikipedia.org/wiki/Lint> とかがあります。  
商品として売られているものもいっぱいあります (名前やリンクを出してよいのかわからないので保留)

C# 用の解析ツールってあったっけかな？  
言語仕様/コンパイラ/IDE が十分賢いのでほぼいらない気がする。  
追記：検索してみた。いっぱいあるようだ。名前やリンクを出してよいかわからないので提示しないでおく。

# タグ [アルゴリズム] はこの目的には不適切だと思う  
# そもそも [答えのある質問] でも無いと思う。


CC BY-SA 3.0
2015-03-26T21:47:01.277
8451
2015-03-27T01:56:48.510
2015-03-27T01:56:48.510
8589
8589
8441
answer


言語によってコンパイラ構造が異なるため、一般論として答えを得ることは無理です。

例えばC#言語の場合、CIL;
共通中間言語にコンパイルされます。その際、メタデータやデバッグ情報（対応するソースコード行など）が保持されているため、ソースコードではなくCILに対して静的解析を行い、解析結果から対応するソースコード行を指摘することができます。その機能は既に提供されていて[マネージ
コードに対するコード分析](https://msdn.microsoft.com/ja-
jp/library/3z0aeatx.aspx)となっています。これ自体がフレームワークとして提供されているため、独自の分析を追加することもできます。  
これらはあくまでコンパイル結果を参照しているため、質問後半のコーディングフォーマットについてはあまり対応できません。しかし次バージョンからは[.NET
Compiler Platform
("Roslyn")](https://github.com/dotnet/roslyn)が導入され、ソースコードに対しても分析を行うフレームワークが用意されます。

C++言語の場合、C#言語と異なりマクロ、templateやinline展開などを前提としているためコンパイル結果からの分析は非常に困難です。Microsoftでは[SAL注釈](https://msdn.microsoft.com/ja-
jp/library/hh916383.aspx)という独自の機能を用意しています。これは関数宣言にその関数の振る舞いに関する注釈を加えることで呼び出し元との整合性をチェックする機構です。加えて、Microsoftの提供するヘッダーファイルにはこの注釈が記述されています。これらによりコンパイル時に静コード分析を行っています。  
コーディングフォーマットについてはあまり対応できていないかも。

コーディングフォーマットについては静的解析を行うよりも何らかのツールで整形してしまえばいいように思います。


CC BY-SA 3.0
2015-03-28T01:36:26.317
8497
2015-03-28T01:36:26.317
4236
8441
answer


「1. 実行文としての構文解析」が通常の静的解析です。  
「2.
コーディングフォーマットとしての構文解析(コメント、インデントなども含めた)」は、コーディングルールの遵守を検証するものです。「lint」で検索するとよいかもしれません。  
個別に質問したほうがよいと思います。


CC BY-SA 3.0
2015-08-22T10:13:39.297
14728
2015-08-22T10:13:39.297
4727
8441
answer