CCgrep覚書
#何ができるの?
コードクローン検出
grep拡張版
#元論文
https://sel.ist.osaka-u.ac.jp/lab-db/betuzuri/archive/1171/1171.pdf
#ツール先
https://github.com/yuy-m/CCGrep
#実行方法(windows) インストールとかいらん。maven設定もいらん
$java -jar CCGrep.jar -r -p nf 'if($$) {$$}' java2/
・-r = 再帰
・-p nf = 行位置 + ヒット行出す
・-p n = 行位置
#右辺あり
$ java -jar CCGrep.jar -r -p nf 'T a = b;' java2|less
java2\MITREidDataService_1_0.java
109: private static final String THIS_VERSION = MITREID_CONNECT_1_0;
#右辺なしの場合
$ java -jar CCGrep.jar -r -p nf 'T a;' java2|less
java2\WhitelistedSite.java
65: private String clientId
#switch文だけを取得
$ java -jar CCGrep.jar -r -p nf 'switch ($$) {$$}' java2|less
java2\DataAPI.java
92: switch (tok) {
93: case NAME:
94: String name = reader.nextName();
95:
96: if (supportedVersions.contains(name)) {
97: // we're working with a known data version tag
98: for (MITREidDataService dataService : importers) {
99: // dispatch to the correct service
100: if (dataService.supportsVersion(name)) {
101: dataService.importData(reader);
102: break;
103: }
104: }
105: } else {
106: // consume the next bit silently for now
107: logger.debug("Skipping value for " + name); // TODO: write these out?
108: reader.skipValue();
109: }
110: break;
111: case END_OBJECT:
112: break;
113: case END_DOCUMENT:
114: break;
115: }
##for文抽出
$ java -jar CCGrep.jar -r -p nf 'for($$){$$} $' java2|less
#while文抽出
$ java -jar CCGrep.jar -r -p nf 'while($$){$$}' java2|less
$case文抽出
$ java -jar CCGrep.jar -r -p nf 'case $$: $$; $$;' java2|less
#変数jwt定義への代入
$ java -jar CCGrep.jar -r -p nf '$jwt = $$;' java2
#変数jwtの使用箇所
$ java -jar CCGrep.jar -r -p nf '= $jwt $|$jwt =' java2
#grep の |(パイプ) の使い方
' $| '
-b none 完全一致する識別子,リテラルのみにマッチす
る.図 1 のクエリと検索対象を使用した場合,対象 1
のみが検出される.
$ java -jar CCGrep.jar -r -p nf -b none 'name.equals' java2|head
java2\Claim.java
244: } else if (!name.equals(other.name)) {
java2\DefaultUserInfo.java
665: } else if (!name.equals(other.name)) {
java2\JavaParserJsonDeserializer.java
76: if (name.equals(JsonNode.CLASS.propertyKey)) {
java2\JavaParserJsonDeserializer.java
236: if (name.equals(JsonNode.RANGE.propertyKey)) {
java2\JavaParserJsonDeserializer.java
253: if (name.equals(JsonNode.TOKEN_RANGE.propertyKey)) {
-b full 識別子・リテラルはすべて同一視し,リネームさ
れたクローンにマッチする.図 1 のクエリと検索対象
を使用した場合,対象 1,2,3 すべてが検出される.
$ java -jar CCGrep.jar -r -p nf -b full 'name.equals' java2|head
java2\AbstractClientEntityView.java
21:package org.mitre.openid.connect.view;
java2\AbstractClientEntityView.java
21:package org.mitre.openid.connect.view;
java2\AbstractClientEntityView.java
21:package org.mitre.openid.connect.view;
java2\AbstractClientEntityView.java
21:package org.mitre.openid.connect.view;
java2\AbstractClientEntityView.java
23:import java.io.IOException;
-b consistent (デフォルト) 識別子はパラメータ化,
リテラルはリネームされ,パラメータ化されたクロー
ンにのみマッチする.図 1 のクエリと検索対象を使用
した場合,対象 1,2 は検出されるが対象 3 は検出さ
れない
$ java -jar CCGrep.jar -r -p nf -b consistent 'name.equals' java2|head
java2\AbstractClientEntityView.java
21:package org.mitre.openid.connect.view;
java2\AbstractClientEntityView.java
21:package org.mitre.openid.connect.view;
java2\AbstractClientEntityView.java
21:package org.mitre.openid.connect.view;
java2\AbstractClientEntityView.java
21:package org.mitre.openid.connect.view;
java2\AbstractClientEntityView.java
23:import java.io.IOException;
引用:https://sel.ist.osaka-u.ac.jp/lab-db/betuzuri/archive/1171/1171.pdf
#引数0
$ java -jar CCGrep.jar -r -p nf 'f();' java2|head
java2\AbstractClientEntityView.java
68: private JsonParser parser = new JsonParser();
java2\AbstractClientEntityView.java
135: .create();
java2\AbstractClientEntityView.java
141: protected abstract ExclusionStrategy getExclusionStrategy();
java2\AbstractClientEntityView.java
159: Writer out = response.getWriter();
java2\AbstractPageOperationTemplate.java
98: long startTime = System.currentTimeMillis();
#引数が1つ
$ java -jar CCGrep.jar -r -p nf 'f($$);' java2|head
java2\AbstractClientEntityView.java
66: private static final Logger logger = LoggerFactory.getLogger(AbstractClientEntityView.class);
java2\AbstractClientEntityView.java
68: private JsonParser parser = new JsonParser();
java2\AbstractClientEntityView.java
76: return new JsonPrimitive(src.getName());
java2\AbstractClientEntityView.java
86: return new JsonPrimitive(src.getName());
java2\AbstractClientEntityView.java
96: return new JsonPrimitive(src.getName());
#引数が2つ
$ java -jar CCGrep.jar -r -p nf 'f($$,$$);' java2|head
java2\AbstractClientEntityView.java
161: gson.toJson(obj, out);
java2\AbstractClientEntityView.java
165: logger.error("IOException in JsonEntityView.java: ", e);
java2\AbstractPageOperationTemplate.java
71: this(DEFAULT_MAX_PAGES, DEFAULT_MAX_TIME_MILLIS, operationName);
java2\AbstractPageOperationTemplate.java
121: logger.debug("Swallowing exception " + e.getMessage(), e);
java2\AbstractPageOperationTemplate.java
133: finalReport(operationsCompleted, exceptionsSwallowedCount, exceptionsSwallowedClasses);
#引数が3つ
$ java -jar CCGrep.jar -r -p nf 'f($$,$$,$$);' java2|head
java2\AbstractPageOperationTemplate.java
71: this(DEFAULT_MAX_PAGES, DEFAULT_MAX_TIME_MILLIS, operationName);
java2\AbstractPageOperationTemplate.java
133: finalReport(operationsCompleted, exceptionsSwallowedCount, exceptionsSwallowedClasses);
java2\AbstractPageOperationTemplateTest.java
156: super(maxPages, maxTime, "CountingPageOperation");
java2\ApprovedSiteService.java
38: public ApprovedSite createApprovedSite(String clientId, String userId, Date timeoutDate, Set<String> allowedScopes);
java2\AssertionOAuth2RequestFactory.java
39: OAuth2Request createOAuth2Request(ClientDetails client, TokenRequest tokenRequest, JWT assertion);
$