Skip to content

Commit a5e0c44

Browse files
committed
Adding CosmosSDK signature mapper
1 parent 06ef1d9 commit a5e0c44

File tree

3 files changed

+121
-11
lines changed

3 files changed

+121
-11
lines changed

go-lisa/src/main/java/it/unive/golisa/checker/cosmos/panic/ABCIPanicChecker.java

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import it.unive.golisa.analysis.DummyDomain;
99
import it.unive.golisa.cfg.VariableScopingCFG;
10+
import it.unive.golisa.cfg.expression.GoCollectionAccess;
1011
import it.unive.golisa.cfg.expression.GoPanic;
1112
import it.unive.golisa.cfg.expression.GoRecover;
1213
import it.unive.golisa.cfg.statement.GoDefer;
@@ -20,6 +21,7 @@
2021
import it.unive.golisa.checker.utils.graph.edges.LabeledEdge;
2122
import it.unive.golisa.checker.utils.graph.edges.StandardEdge;
2223
import it.unive.golisa.checker.utils.graph.nodes.StandardNode;
24+
import it.unive.golisa.cosmossdk.util.CosmosUtils;
2325
import it.unive.golisa.golang.api.signature.FuncGoLangApiSignature;
2426
import it.unive.golisa.golang.api.signature.GoLangApiSignature;
2527
import it.unive.golisa.golang.api.signature.MethodGoLangApiSignature;
@@ -160,13 +162,25 @@ private boolean maybeRecovery(GoDefer defer) {
160162
} else if(expr instanceof UnresolvedCall) {
161163
//TODO:add possible saniteizer list
162164

163-
if(!matchAnyGoAPIMethodOrFunctionSignatures((UnresolvedCall) expr))
165+
if(!matchAnyGoAPIMethodOrFunctionSignatures((UnresolvedCall) expr) && !matchAnyUnsafeMethodOrFunctionSignatures((UnresolvedCall) expr))
164166
return true;
165167
}
166168
return false;
167169
}
168170

169171

172+
private boolean matchAnyUnsafeMethodOrFunctionSignatures(UnresolvedCall call) {
173+
Map<String, Set<FuncGoLangApiSignature>> mapf = CosmosUtils.getCosmosApiFunctionSignatures();
174+
175+
for(String pckg : mapf.keySet())
176+
for(FuncGoLangApiSignature f : mapf.get(pckg))
177+
if(matchSignature(f, call))
178+
return true;
179+
180+
return false;
181+
}
182+
183+
170184
private boolean matchAnyGoAPIMethodOrFunctionSignatures(UnresolvedCall call) {
171185
Map<String, Set<FuncGoLangApiSignature>> mapf = GoLangUtils.getGoLangApiFunctionSignatures();
172186
Map<String, Set<MethodGoLangApiSignature>> mapm = GoLangUtils.getGoLangApiMethodSignatures();
@@ -193,15 +207,9 @@ else if (goLangApiSignature instanceof MethodGoLangApiSignature)
193207
signatureName = ((MethodGoLangApiSignature) goLangApiSignature).getName();
194208

195209
if (signatureName != null && signatureName.equals(call.getTargetName())
196-
&& call.getParameters().length > 0
197-
&& call.getParameters()[0] instanceof VariableRef) {
198-
199-
VariableRef var = (VariableRef) call.getParameters()[0];
200-
if (goLangApiSignature instanceof FuncGoLangApiSignature)
201-
if(goLangApiSignature.getPackage().contains(var.getName()))
210+
&& call.getParameters().length > 0) {
211+
if(goLangApiSignature.getPackage().contains(call.getQualifier()))
202212
return true;
203-
else
204-
return true;
205213
}
206214

207215
return false;
@@ -296,8 +304,6 @@ private boolean atLeastOnePathWithoutRecoveryRecursive(GraphForCheckers panicGra
296304
if(stNode instanceof PossileRecoveryNode || stNode instanceof RecoveryNode)
297305
return false;
298306

299-
300-
301307
Collection<LabeledEdge> ingoingEdges = panicGraphWithRecoveries.getIngoingEdges(stNode);
302308
if(!ingoingEdges.isEmpty())
303309
for(LabeledEdge e : ingoingEdges) {
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
package it.unive.golisa.cosmossdk.util;
2+
3+
import it.unive.golisa.golang.api.signature.ConstGoLangApiSignature;
4+
import it.unive.golisa.golang.api.signature.FuncGoLangApiSignature;
5+
import it.unive.golisa.golang.api.signature.MethodGoLangApiSignature;
6+
import it.unive.golisa.golang.api.signature.TypeGoLangApiSignature;
7+
import it.unive.golisa.golang.api.signature.VarGoLangApiSignature;
8+
import java.util.HashMap;
9+
import java.util.HashSet;
10+
import java.util.Map;
11+
import java.util.Set;
12+
13+
public class CosmosSDKAPISignatureMapper {
14+
15+
private static CosmosSDKAPISignatureMapper instance = null;
16+
17+
// singleton pattern
18+
public static synchronized CosmosSDKAPISignatureMapper getGoApiSignatures() {
19+
if (instance == null) {
20+
instance = new CosmosSDKAPISignatureMapper();
21+
}
22+
return instance;
23+
}
24+
25+
private final Map<String, Set<ConstGoLangApiSignature>> mapConst;
26+
private final Map<String, Set<FuncGoLangApiSignature>> mapFunc;
27+
private final Map<String, Set<MethodGoLangApiSignature>> mapMethod;
28+
private final Map<String, Set<TypeGoLangApiSignature>> mapType;
29+
private final Map<String, Set<VarGoLangApiSignature>> mapVar;
30+
private final Set<String> pkgs;
31+
32+
private CosmosSDKAPISignatureMapper() {
33+
long t = System.currentTimeMillis();
34+
pkgs = new HashSet<>();
35+
mapConst = new HashMap<String, Set<ConstGoLangApiSignature>>();
36+
mapFunc = new HashMap<String, Set<FuncGoLangApiSignature>>();
37+
mapMethod = new HashMap<String, Set<MethodGoLangApiSignature>>();
38+
mapType = new HashMap<String, Set<TypeGoLangApiSignature>>();
39+
mapVar = new HashMap<String, Set<VarGoLangApiSignature>>();
40+
41+
build();
42+
43+
t = System.currentTimeMillis() - t;
44+
System.out.println(t);
45+
}
46+
47+
public Set<String> getPackages() {
48+
return pkgs;
49+
}
50+
51+
public Map<String, Set<ConstGoLangApiSignature>> getMapConst() {
52+
return mapConst;
53+
}
54+
55+
public Map<String, Set<FuncGoLangApiSignature>> getMapFunc() {
56+
return mapFunc;
57+
}
58+
59+
public Map<String, Set<MethodGoLangApiSignature>> getMapMethod() {
60+
return mapMethod;
61+
}
62+
63+
public Map<String, Set<TypeGoLangApiSignature>> getMapType() {
64+
return mapType;
65+
}
66+
67+
public Map<String, Set<VarGoLangApiSignature>> getMapVar() {
68+
return mapVar;
69+
}
70+
71+
private void build() {
72+
String pkg = "telemetry";
73+
pkgs.add(pkg);
74+
Set<FuncGoLangApiSignature> set = new HashSet<>();
75+
set.add(new FuncGoLangApiSignature(pkg, "EnableTelemetry", new String[] {""} , new String[] {""}));
76+
set.add(new FuncGoLangApiSignature(pkg, "IncrCounter", new String[] {"float32", "...string"} , new String[] {""}));
77+
set.add(new FuncGoLangApiSignature(pkg, "ncrCounterWithLabels ", new String[] {"[]string", "float32", "[]metrics.Label"} , new String[] {""}));
78+
set.add(new FuncGoLangApiSignature(pkg, "IsTelemetryEnabled", new String[] {""} , new String[] {"bool"}));
79+
set.add(new FuncGoLangApiSignature(pkg, "MeasureSince", new String[] {"time.Time", "...string"} , new String[] {""}));
80+
set.add(new FuncGoLangApiSignature(pkg, "ModuleMeasureSince", new String[] {"string", "time.Time", "...string"} , new String[] {""}));
81+
set.add(new FuncGoLangApiSignature(pkg, "ModuleSetGauge", new String[] {"string", "float32", "...string"} , new String[] {""}));
82+
set.add(new FuncGoLangApiSignature(pkg, "NewLabel", new String[] {"string", "string"} , new String[] {"metrics.Label"}));
83+
set.add(new FuncGoLangApiSignature(pkg, "Now", new String[] {""} , new String[] {"time.Time"}));
84+
set.add(new FuncGoLangApiSignature(pkg, "SetGauge", new String[] {"float32", "...string"} , new String[] {""}));
85+
set.add(new FuncGoLangApiSignature(pkg, "SetGaugeWithLabels", new String[] {"[]string", "float32", "[]metrics.Label"} , new String[] {""}));
86+
mapFunc.put(pkg, set);
87+
88+
}
89+
90+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package it.unive.golisa.cosmossdk.util;
2+
3+
import java.util.Map;
4+
import java.util.Set;
5+
6+
import it.unive.golisa.golang.api.signature.FuncGoLangApiSignature;
7+
8+
public class CosmosUtils {
9+
10+
public static Map<String, Set<FuncGoLangApiSignature>> getCosmosApiFunctionSignatures() {
11+
return CosmosSDKAPISignatureMapper.getGoApiSignatures().getMapFunc();
12+
}
13+
14+
}

0 commit comments

Comments
 (0)