mirror of
https://github.com/github/codeql.git
synced 2026-01-29 22:32:58 +01:00
Add a test.
This commit is contained in:
@@ -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 |
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
missingCallee
|
||||
spuriousCallee
|
||||
@@ -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")
|
||||
}
|
||||
Reference in New Issue
Block a user