コード分​​析を含むための宿題テストプラットフォームを拡張する(C/C ++)

StackOverflow https://stackoverflow.com/questions/3710532

質問

宿題のテストのためのプラットフォームを維持/開発しています。ほとんど自動です。今追加する必要があるのはコード分析です。特定のコンストラクトについてコードを確認する必要があります。

例えば:

ファイルはありますか main.cpp 名前のクラスが含まれています user constメソッドを使用します get_name()?

私がそのようなことをすることを可能にするいくつかのツールがそこにありますか(理想はスクリプト化できるものです)。 Linuxのみ。

役に立ちましたか?

解決 4

MozillaからDehydraツールを発見しました。それは主に内部目的のために書かれているようですが、それはまさに私が探していたものかもしれません。

https://developer.mozilla.org/en/dehydra/using_dehydra

編集:Dehydraは素晴らしいです。 constメソッドの決定など、いくつかのマイナーな機能が欠けていますが、それ以外の場合は素晴らしいです。

他のヒント

1つの可能性は、コードを実行することです GCC そして、使用します GCC-XML プログラムの内部構造のXML説明を作成するための拡張。次に、お気に入りのXMLライブラリを使用してドキュメントを解析するか、XSLTを適用する必要がある場合は、HTMLなどとして表示するだけでもXSLTを適用できます。

おそらく使用したものを一緒にハッキングすることができます GCC-XMLフレームワーク あまり困難なく。

これはどのように適用されますか C? :)

ファイルmain.cppには、constメソッドget_name()を持つユーザーという名前のクラスが含まれていますか?

別のファイル(test.cpp)を作成します

void test(void) {
  const user x;
  x.get_name();
}

test.cppとmain.cppを一緒にコンパイルします。エラーがある場合(コードを終了!= 0)、 いいえ!, 、ファイルmain.cppは、特定の方法でユーザーという名前の(public)classを定義しません。

警告:私は知っています C++, 、したがって、上記の大きな(またはマイナーな)エラーを許してください。


編集 スクリプトが追加されました

#! /bin/sh

cat main.c test.c > 3710532.c
if gcc 3710532.c > /dev/null 2>&1
then echo OK
else echo BZZZT
fi
rm 3710532.c

すぐに使用できません C++ 私がオンになっているこのマシンにインストールされたコンパイラなので、私のテストは C コンパイラと C ファイル。私のコンパイラは「一緒に働いていません」 gcc -combine main.c test.c だから私はその部分を微調整しました。

このスクリプトを機能している組み合わせで実行します main.ctest.c 出力「OK」、それ以外の場合は「bzzzt」を出力します。


テストにはこれを使用しました main.c

typedef int user;

int get_name(void) {
  return 0;
}

int main(void) {
  return 0;
}

この test.c

void test(void) {
  const user x;
  get_name();
}

サンプルの実行

$ ./3710532.sh
OK

任意のコード分析を行う場合は、任意の解析/一致などが必要です。 GCC-XMLは宣言情報を提供しますが、メソッドの内容は提供されません。

私たちの DMSソフトウェアリエンジニアリングツールキット GCC-XMLと同じ抽象情報を提供しますが、さらに、定義の内容(メソッドボディ情報)の完全な詳細が含まれています。 C ++フロントエンド. 。これにより、デルカレーションにアクセスできます 学生プログラムを確認するコンテンツ。

DMSは、AST、シンボルテーブル、ソースパターンマッチングへの汎用解析を提供します。 C ++フロントエンドは、完全なC ++解析、C ++ ASTの構築、および対応するシンボル情報を提供します。その後、認識のために行うことはあなた次第ですが、あなたの例は特定のパターンを探すことについてのようです。

例の半分は、C ++のいくつかのDMSソースパターンによって処理されます。

pattern is_correct_student_class(m:members):class =
  " class user { \m } ".

pattern is_correct_student_method_present(p:parameters,s:statements):method =
  " const  get_name(\p) { \s } "

(私のC ++構文を許してください、私はそれをあまり書きません)、それぞれASTとそれぞれ任意のASTに一致します。引用符はメタコートであり、内部の内部はエスケープ p、 m、および sがメトバリスP、M、およびSを表すC ++構文であり、構文的にはパラメーターリスト、メソッドリストとステートメントリストでなければなりません。パターンに一致するように。パラメーターリストなどの定義は、C ++フロントエンドのC ++文法部分から自動的に導出されます。

残りの半分は、C ++パーサーと名前/タイプのリゾルバーを呼び出した後に実行されたDMS Parlanseコードの少しで実装されます。

   (define has_student_code (lamdba (function boolean [tree AST]))
      (AST:IsInTree tree
          (lambda (function boolean [tree1 AST]
              (&& (Registry:MatchPattern tree1 "is_correct_student_class")
                  (AST:IsInList (AST:GetNthGrammarChild tree1 4) ; the member list
                       (lambda (function boolean [tree2 AST]) 
                           (Registry:MatchPattern tree2 ; a member
                                 "is_correct_student_method_present")
                       )lambda
          )lambda
      )
   )define

プレゼンテーションを簡素化するためにいくつかの自由が取られました。

これは非常に簡単なチェックです。 Parlanseコードからシンボルテーブルにアクセスして、それが理にかなっている場合、より洗練されたチェックを行うことができます。

DMSはLinuxの下で直接実行されませんが、ワインの下で実行されているようです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top