Add a test.

This commit is contained in:
Max Schaefer
2020-03-25 20:34:34 +00:00
parent e6bdc1809b
commit 46a1a4e010
4 changed files with 50 additions and 1 deletions

View File

@@ -1,2 +1,5 @@
missingCallee
spuriousCallee
| main.go:44:3:44:7 | call to m | main.go:17:1:17:17 | function declaration |
| main.go:44:3:44:7 | call to m | main.go:21:1:21:20 | function declaration |
| main.go:56:2:56:6 | call to m | main.go:21:1:21:20 | function declaration |

View File

@@ -35,5 +35,23 @@ func test(x *s1, y s2, z s3, b mybool, i I) {
}
func test2(v interface{}) {
v.(interface{ m(int) }).m(0) // callee: s3.m
v.(interface{ m(int) }).m(0) // callee: s3.m
}
func test3(v I) {
if v == nil {
v = s1{}
v.m() // callee: s1.m
}
v.m() // callee: s1.m callee: s2.m callee: mybool.m
}
func test4(b bool) {
var v I
if b {
v = s1{}
} else {
v = &s2{}
}
v.m() // callee: s1.m callee: s2.m
}

View File

@@ -0,0 +1,2 @@
missingCallee
spuriousCallee

View File

@@ -0,0 +1,26 @@
import go
import semmle.go.dataflow.internal.DataFlowDispatch
/**
* Gets a string `val` such that there is a comment on the same line as `l`
* that contains the substring `key: val`.
*/
string metadata(Locatable l, string key) {
exists(string f, int line, Comment c, string kv |
l.hasLocationInfo(f, line, _, _, _) and
c.hasLocationInfo(f, line, _, _, _) and
kv = c.getText().regexpFind("\\b(\\w+: \\S+)", _, _) and
key = kv.regexpCapture("(\\w+): (\\S+)", 1) and
result = kv.regexpCapture("(\\w+): (\\S+)", 2)
)
}
query predicate missingCallee(DataFlow::CallNode call, FuncDef callee) {
metadata(call.asExpr(), "callee") = metadata(callee, "name") and
not viableCallable(call.asExpr()) = callee
}
query predicate spuriousCallee(DataFlow::CallNode call, FuncDef callee) {
viableCallable(call.asExpr()) = callee and
not metadata(call.asExpr(), "callee") = metadata(callee, "name")
}