ソースコードの類似性を比較できるツールを探しています。
現在、非常に簡単なシステムがあり、大量の偽陽性があり、真の陽性は簡単にそれらに埋もれてしまいます。
私の要件は:
編集:
混乱を避けるために、次の2つのコードスニペットは同一であり、そのように検出する必要があります。
for (int i = 0; i < 10; i++) { bla; }
int i; while (i < 10) { bla; i++; }
こっちも一緒:
int x = 10; y = x + 5;
int a = 10; y = a + 5;
過去にMOSSを使用しました: http://theory.stanford.edu/~aiken/moss/ 盗用されたコードを検出します。セマンティックレベルで機能するため、上記の状況を検出します。このツールは言語に対応しているため、コメントは分析で考慮されず、変数名や関数名の単純な検索と置換によって変更されたコードを検出するのに役立ちます。
注:数年前に大学院でコンピュータサイエンスを教えていたときにこのツールを使用しました。このツールは、インターネットから削除されたコードを検出するのに素晴らしく機能しました。同様のアプリケーションのよく文書化されたアカウントは次のとおりです: http://fie2012.org/sites/fie2012.org/history/fie99/papers/1110.pdf
「ソフトウェアの類似性を測定する」とググると、さらに役立つヒットがいくつか見つかります。 http://www.ics.heacademy.ac.uk/resources/assessment/plagiarism/detectiontools_sourcecode.html
コンピューターサイエンスの用語での問題は、ソースコードの盗用の検出として示される場合があります。ドブス博士に関するこの記事を読むことから始めるのがよいでしょう: Detecting Source-Code Plagiarism 。ソースコードの盗作を検出するためのアルゴリズムがリストされています。
注:あなたが求めているのは確かに難しいコンピューティング問題です:)
[〜#〜] pmd [〜#〜] からコピーして貼り付けて検出することができます
JPLAG( https://github.com/jplag/jplag )を使用してコードの類似性をチェックし、学生がJavaとテキストファイルで動作することを比較します。同じコード構造と変数Substitutionをチェックするのに十分です。
duplo を試すことができます。それは一般的な行を見つけます。空白の変更を無視する機能はいくつかありますが、名前が変更された変数を含むコードは検出されないため、盗用を検出する際のヘルプよりもクリーンアップ支援です。
(回答は遅れますが、質問の関連性がなくなることはありません)
私は同様の問題に直面し、Webベースのアプリケーションを作成しました。
https://jefferey-cave.gitlab.io/miss/
私はjavascriptとpythonで教えていたので、それらはそれが扱う言語です。 (現在)C/C++を処理しません。 JavascriptインタープリターがCを処理する方法を知りたいと思います。
私が直面した問題は、国境を越えて学生のコードを提出することが違法である(MOSSは禁止されている)ため、ローカルで実行できるものが必要でした。実装は純粋なクライアント側ブラウザです。
教室でのグループのダイナミクス(だれが誰と一緒に働いているか、誰と一緒に勉強しているのか)を決定するのに、これがより役立つことがわかりました。
楽しいライブグラフィックがいくつかあるので、彼らが最初の課題を提出した後、学部生のクラスに見せることは役に立ちました。最初の課題には常に高い類似性があったため、それをライブで実証しても害はありません(提出名は匿名化されています)。
私はいつも、(ひどく露骨に)浮気していると思った生徒の話をします。彼らの作品は、他の学生の非常にユニークな答えと驚くべき類似性を示しました。学生の課題をクラスの残りの部分と比較すると、クラスの残りの部分と比較して有意な類似性がないことがわかりました。これは提出物のより深い調査につながりました...チュートリアルがあり、スタイルが示されていたことがわかりましたが、作業は独特でした。
何も起こりませんでした、そしてそれらの学生は彼らがどれほど近くに来たか決してしませんでした。