Skip to content

Commit 0bd81a0

Browse files
authored
Merge pull request #108 from codefuse-ai/icse25
[doc] add experiments scripts for icse25 paper @xiexie
2 parents a659ee3 + 45914d9 commit 0bd81a0

37 files changed

+29934
-0
lines changed

example/icse25/Keymap/FindAllReleasedHttpAPI.gdl

+1,339
Large diffs are not rendered by default.

example/icse25/Keymap/FindAllReleasedTrAPI.gdl

+695
Large diffs are not rendered by default.

example/icse25/motivation example.md

+127
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
# Motivation Example
2+
3+
## Relation
4+
5+
### Java
6+
7+
```
8+
field(id, tid, name, locId)
9+
method(id, tid, name)
10+
parent(id1, id2)
11+
class(id, name)
12+
interface(id, name)
13+
type(id, n)
14+
javaLoc(locId, s, e, path)
15+
```
16+
17+
### XML
18+
19+
```
20+
xmlEle()
21+
xmlAttri()
22+
```
23+
24+
### JS/TS
25+
26+
```
27+
enclose(exprId, methodId)
28+
callExpr(exprId, methodId, argExprId, callSiteId)
29+
reference(refId, defId)
30+
service(id, appId, locId)
31+
jsLoc(locId, s, e, path)
32+
app(id, name)
33+
api(id, apiName, apiSignature, appId)
34+
functionLikeDeclaration(id, name)
35+
parent(id1, id2)
36+
class(id, name)
37+
```
38+
39+
## Rule
40+
41+
### Java
42+
43+
```
44+
changedField(fid) :- (
45+
field(fid, _, _, locId),
46+
loc(locId, s, e, path),
47+
changedSet(line, path),
48+
line >= s,
49+
line <= e
50+
).
51+
fieldInClassType(fName, tName) :- (
52+
field(fid, _, fName),
53+
parent(fid, cid),
54+
class(cid, tName),
55+
type(tid, tName)
56+
).
57+
58+
fieldInDescendantClassType(fName, tName) :- fieldInClassType(fName, tName).
59+
fieldInDescendantClassType(fName, tName) :- fieldInClassType(fName, tName1), fieldInDescendantClassType(tName1, tName).
60+
61+
changedMethodInInterface(fid, mid, iid) :- (
62+
changedField(fid),
63+
field(fid, _, fName, _),
64+
fieldInDescendantClassType(fName, tName),
65+
type(tid, tName),
66+
method(mid, tid, _),
67+
parent(mid, iid),
68+
interface(iid, _)
69+
).
70+
```
71+
72+
### Java, XML
73+
74+
参考原论文
75+
76+
```
77+
getChangedTrAPI(trInterfaceName, trMethodName) :- (
78+
changedMethodInInterface(fid, mid, iid),
79+
method(mid, _, trMethodName),
80+
interface(iid, trInterfaceName),
81+
service(bid, cid),
82+
in(iid, cid)
83+
).
84+
```
85+
86+
### JS
87+
88+
```
89+
getAppFacade(appName, proxyFacadeName, facadeQualifiedName) :- (
90+
service(id, appId, locId),
91+
jsLoc(locId, _, _, path),
92+
path = "config/proxy.js",
93+
app(appId, appName),
94+
api(_, proxyFacadeName, facadeQualifiedName, appId)
95+
).
96+
getInfluencedTrAPI(appName, proxyFacadeName, facadeQualifiedName, trMethodName) :- (
97+
getChangedTrAPI(facadeQualifiedName, trMethodName),
98+
getAppFacade(appName, proxyFacadeName, facadeQualifiedName)
99+
).
100+
```
101+
102+
### TS
103+
104+
```
105+
getInfluencedTrAPICall(appName, proxyFacadeName, callExprId) :- (
106+
getInfluencedTrAPI(appName, proxyFacadeName, facadeQualifiedName, trMethodName),
107+
callExpr(callExprId, mid, _, callSiteId),
108+
reference(callSiteId, defId),
109+
api(defId, proxyFacadeName, _, _)
110+
).
111+
112+
getInfluencedFrontEndAPI(rpcName, trFuncName) :- (
113+
getInfluencedTrAPICall(_, _, callExprId),
114+
enclose(callExprId, methodId),
115+
functionLikeDeclaration(mid, trFuncName),
116+
parent(mid, cid),
117+
class(cid, rpcName)
118+
).
119+
```
120+
121+
## Workflow
122+
123+
1. 根据变更行号,识别出变更内容为新增某一个Field f。
124+
2. 通过影响面分析,得出有一个 Interface 的函数 m 的返回类型为包含这个新增字段的类 c。
125+
3. 通过结合xml配置分析,这个函数 m 所在的 Interface i 实际为一个对外发布的 rpc 接口。
126+
4. 通过分析 bff 应用的配置 proxy.js 文件,发现 该应用 配置了 变更的 rpc 接口。
127+
5. 通过分析 bff 应用里所有的 函数调用,发现有使用了 该变更的 rpc 接口,并且 调用函数所在类也是对前端开放的服务接口,由于调用函数的传参与变更后的不一致,导致查询失败,使用该接口的前端服务全部崩溃。

example/icse25/procedure.md

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
实验步骤:
2+
3+
1. 运行gitdiff脚本,识别出两个commit之间的所有变更文件名和行号
4+
2. 运行rule1.gdl,将变更文件名和行号转换为对应的java ecg node id。
5+
3. 运行rule5.gdl,将变更文件名和行号转换为对应的xml ecg node id。
6+
4. 运行rule4.gdl,输入为rule1找到的java ecg node,输出为这些ecg node影响到的发布的http request函数。
7+
4. 运行rule2.gdl,输入为rule1找到的java ecg node,输出为这些ecg node影响到的http response函数。
8+
5. 运行rule6.gdl,输入为rule1和rule5找到的所有ecg node,输出为这些ecg node是否为发布的tr接口。
9+
6. 运行rule7.gdl,输入为rule5找到的xml ecg node,输出为这些node对应的mybatis 框架下的java源码,字段或函数。
10+
7. 运行rule8.gdl,输入为rule1和rule7找到的所有ecg node,输出为这些ecg node 影响到的发布的tr接口。
11+
8. 运行rule13.gdl,输入为变更行和行号,输出为本次变更的变更影响调用链路的调用根节点的函数签名(默认为baseline)。
12+
9. 比较rule13与rule4,rule6的结果。
13+
10. rule17 仓库地址:{unknown}
14+
11. 运行rule17, 输入为rule1找到的java ecg node,输出为本次变更影响到的tr接口和函数名。
15+
12. BFF为私仓,本地下好。
16+
13. 运行rule18, 输入为rule17找到的tr接口全名和函数名,输出为BFF应用使用到的appname配置,tr接口和函数名。
17+
14. 运行rule19,输入为rule18找到的appname配置,tr接口和函数名,输出为使用到这些tr接口的rpc接口和函数
18+
19+
update 版本
20+
1. 运行gitdiff脚本,识别出两个commit之间的所有变更文件名和行号
21+
2. 运行rule_ecg.gdl,输入为变更行和行号,输出为本次变更的tr接口和http接口信息。
22+
3. 运行rule_1_5.gdl,输入为变更行和行号,输出为本次变更的ecg node。
23+
4. 运行rule_6_8.gdl,输入为变更行和行号,输出为本次变更的tr接口。
24+
5. 运行rule_1_4.gdl,输入为变更行和行号,输出为本次变更的http接口。
25+
3. 运行rule13.gdl,输入为变更行和行号,输出为本次变更的变更影响调用链路的调用根节点的函数签名(默认为baseline)。
26+
4. 运行rule9 输出为查询到该应用发布的所有http request接口,用于与rule_1_4的结果进行比较。
27+
5. 运行rule12.gdl,输出为该应用发布的所有tr接口、实现类和对应的具体函数信息,用于与rule6_8结果进行比较。

0 commit comments

Comments
 (0)