Skip to content

[doc] add experiments scripts for icse25 paper @xiexie #108

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Apr 28, 2025
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,339 changes: 1,339 additions & 0 deletions example/icse25/Keymap/FindAllReleasedHttpAPI.gdl

Large diffs are not rendered by default.

695 changes: 695 additions & 0 deletions example/icse25/Keymap/FindAllReleasedTrAPI.gdl

Large diffs are not rendered by default.

127 changes: 127 additions & 0 deletions example/icse25/motivation example.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,127 @@
# Motivation Example

## Relation

### Java

```
field(id, tid, name, locId)
method(id, tid, name)
parent(id1, id2)
class(id, name)
interface(id, name)
type(id, n)
javaLoc(locId, s, e, path)
```

### XML

```
xmlEle()
xmlAttri()
```

### JS/TS

```
enclose(exprId, methodId)
callExpr(exprId, methodId, argExprId, callSiteId)
reference(refId, defId)
service(id, appId, locId)
jsLoc(locId, s, e, path)
app(id, name)
api(id, apiName, apiSignature, appId)
functionLikeDeclaration(id, name)
parent(id1, id2)
class(id, name)
```

## Rule

### Java

```
changedField(fid) :- (
field(fid, _, _, locId),
loc(locId, s, e, path),
changedSet(line, path),
line >= s,
line <= e
).
fieldInClassType(fName, tName) :- (
field(fid, _, fName),
parent(fid, cid),
class(cid, tName),
type(tid, tName)
).

fieldInDescendantClassType(fName, tName) :- fieldInClassType(fName, tName).
fieldInDescendantClassType(fName, tName) :- fieldInClassType(fName, tName1), fieldInDescendantClassType(tName1, tName).

changedMethodInInterface(fid, mid, iid) :- (
changedField(fid),
field(fid, _, fName, _),
fieldInDescendantClassType(fName, tName),
type(tid, tName),
method(mid, tid, _),
parent(mid, iid),
interface(iid, _)
).
```

### Java, XML

参考原论文

```
getChangedTrAPI(trInterfaceName, trMethodName) :- (
changedMethodInInterface(fid, mid, iid),
method(mid, _, trMethodName),
interface(iid, trInterfaceName),
service(bid, cid),
in(iid, cid)
).
```

### JS

```
getAppFacade(appName, proxyFacadeName, facadeQualifiedName) :- (
service(id, appId, locId),
jsLoc(locId, _, _, path),
path = "config/proxy.js",
app(appId, appName),
api(_, proxyFacadeName, facadeQualifiedName, appId)
).
getInfluencedTrAPI(appName, proxyFacadeName, facadeQualifiedName, trMethodName) :- (
getChangedTrAPI(facadeQualifiedName, trMethodName),
getAppFacade(appName, proxyFacadeName, facadeQualifiedName)
).
```

### TS

```
getInfluencedTrAPICall(appName, proxyFacadeName, callExprId) :- (
getInfluencedTrAPI(appName, proxyFacadeName, facadeQualifiedName, trMethodName),
callExpr(callExprId, mid, _, callSiteId),
reference(callSiteId, defId),
api(defId, proxyFacadeName, _, _)
).

getInfluencedFrontEndAPI(rpcName, trFuncName) :- (
getInfluencedTrAPICall(_, _, callExprId),
enclose(callExprId, methodId),
functionLikeDeclaration(mid, trFuncName),
parent(mid, cid),
class(cid, rpcName)
).
```

## Workflow

1. 根据变更行号,识别出变更内容为新增某一个Field f。
2. 通过影响面分析,得出有一个 Interface 的函数 m 的返回类型为包含这个新增字段的类 c。
3. 通过结合xml配置分析,这个函数 m 所在的 Interface i 实际为一个对外发布的 rpc 接口。
4. 通过分析 bff 应用的配置 proxy.js 文件,发现 该应用 配置了 变更的 rpc 接口。
5. 通过分析 bff 应用里所有的 函数调用,发现有使用了 该变更的 rpc 接口,并且 调用函数所在类也是对前端开放的服务接口,由于调用函数的传参与变更后的不一致,导致查询失败,使用该接口的前端服务全部崩溃。
27 changes: 27 additions & 0 deletions example/icse25/procedure.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
实验步骤:

1. 运行gitdiff脚本,识别出两个commit之间的所有变更文件名和行号
2. 运行rule1.gdl,将变更文件名和行号转换为对应的java ecg node id。
3. 运行rule5.gdl,将变更文件名和行号转换为对应的xml ecg node id。
4. 运行rule4.gdl,输入为rule1找到的java ecg node,输出为这些ecg node影响到的发布的http request函数。
4. 运行rule2.gdl,输入为rule1找到的java ecg node,输出为这些ecg node影响到的http response函数。
5. 运行rule6.gdl,输入为rule1和rule5找到的所有ecg node,输出为这些ecg node是否为发布的tr接口。
6. 运行rule7.gdl,输入为rule5找到的xml ecg node,输出为这些node对应的mybatis 框架下的java源码,字段或函数。
7. 运行rule8.gdl,输入为rule1和rule7找到的所有ecg node,输出为这些ecg node 影响到的发布的tr接口。
8. 运行rule13.gdl,输入为变更行和行号,输出为本次变更的变更影响调用链路的调用根节点的函数签名(默认为baseline)。
9. 比较rule13与rule4,rule6的结果。
10. rule17 仓库地址:{unknown}
11. 运行rule17, 输入为rule1找到的java ecg node,输出为本次变更影响到的tr接口和函数名。
12. BFF为私仓,本地下好。
13. 运行rule18, 输入为rule17找到的tr接口全名和函数名,输出为BFF应用使用到的appname配置,tr接口和函数名。
14. 运行rule19,输入为rule18找到的appname配置,tr接口和函数名,输出为使用到这些tr接口的rpc接口和函数

update 版本
1. 运行gitdiff脚本,识别出两个commit之间的所有变更文件名和行号
2. 运行rule_ecg.gdl,输入为变更行和行号,输出为本次变更的tr接口和http接口信息。
3. 运行rule_1_5.gdl,输入为变更行和行号,输出为本次变更的ecg node。
4. 运行rule_6_8.gdl,输入为变更行和行号,输出为本次变更的tr接口。
5. 运行rule_1_4.gdl,输入为变更行和行号,输出为本次变更的http接口。
3. 运行rule13.gdl,输入为变更行和行号,输出为本次变更的变更影响调用链路的调用根节点的函数签名(默认为baseline)。
4. 运行rule9 输出为查询到该应用发布的所有http request接口,用于与rule_1_4的结果进行比较。
5. 运行rule12.gdl,输出为该应用发布的所有tr接口、实现类和对应的具体函数信息,用于与rule6_8结果进行比较。
Loading