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 のクエリと検索対象
を使用した場合,対象 123 すべてが検出される.

$ 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 のクエリと検索対象を使用
した場合,対象 12 は検出されるが対象 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;

画像2


引用: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);

$



いいなと思ったら応援しよう!