コード分析を含むための宿題テストプラットフォームを拡張する(C/C ++)
-
02-10-2019 - |
質問
宿題のテストのためのプラットフォームを維持/開発しています。ほとんど自動です。今追加する必要があるのはコード分析です。特定のコンストラクトについてコードを確認する必要があります。
例えば:
ファイルはありますか
main.cpp
名前のクラスが含まれていますuser
constメソッドを使用しますget_name()
?
私がそのようなことをすることを可能にするいくつかのツールがそこにありますか(理想はスクリプト化できるものです)。 Linuxのみ。
解決 4
MozillaからDehydraツールを発見しました。それは主に内部目的のために書かれているようですが、それはまさに私が探していたものかもしれません。
https://developer.mozilla.org/en/dehydra/using_dehydra
編集:Dehydraは素晴らしいです。 constメソッドの決定など、いくつかのマイナーな機能が欠けていますが、それ以外の場合は素晴らしいです。
他のヒント
おそらく使用したものを一緒にハッキングすることができます 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.c
と test.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の下で直接実行されませんが、ワインの下で実行されているようです。