Skip to content

Commit 5e8c63c

Browse files
committed
Use arg position instead of arg as class field to reduce number of instances
1 parent 78c0cdf commit 5e8c63c

File tree

3 files changed

+48
-47
lines changed

3 files changed

+48
-47
lines changed

go/ql/lib/semmle/go/frameworks/stdlib/Log.qll

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,21 @@ import go
77
/** Provides models of commonly used functions in the `log` package. */
88
module Log {
99
private class LogFunction extends Function {
10+
int firstPrintedArg;
11+
1012
LogFunction() {
11-
exists(string fn | fn.matches(["Fatal%", "Panic%", "Print%"]) |
13+
exists(string fn |
14+
fn.matches(["Fatal%", "Panic%", "Print%"]) and firstPrintedArg = 0
15+
or
16+
fn = "Output" and firstPrintedArg = 1
17+
|
1218
this.hasQualifiedName("log", fn)
1319
or
1420
this.(Method).hasQualifiedName("log", "Logger", fn)
1521
)
1622
}
17-
}
1823

19-
private class LogOutput extends Method {
20-
LogOutput() { this.hasQualifiedName("log", "Logger", "Output") }
24+
int getFirstPrintedArg() { result = firstPrintedArg }
2125
}
2226

2327
private class LogFormatter extends StringOps::Formatting::Range instanceof LogFunction {
@@ -27,19 +31,13 @@ module Log {
2731
}
2832

2933
private class LogCall extends LoggerCall::Range, DataFlow::CallNode {
30-
DataFlow::Node messageComponent;
34+
LogFunction target;
3135

32-
LogCall() {
33-
exists(Function f | this = f.getACall() |
34-
f instanceof LogFunction and
35-
messageComponent = this.getASyntacticArgument()
36-
or
37-
f instanceof LogOutput and
38-
messageComponent = this.getSyntacticArgument(1)
39-
)
40-
}
36+
LogCall() { this = target.getACall() }
4137

42-
override DataFlow::Node getAMessageComponent() { result = messageComponent }
38+
override DataFlow::Node getAMessageComponent() {
39+
result = this.getSyntacticArgument(any(int i | i >= target.getFirstPrintedArg()))
40+
}
4341
}
4442

4543
/** A fatal log function, which calls `os.Exit`. */

go/ql/test/query-tests/Security/CWE-312/CleartextLogging.expected

Lines changed: 34 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -73,22 +73,23 @@ nodes
7373
| main.go:24:17:24:24 | password | semmle.label | password |
7474
| main.go:25:13:25:20 | password | semmle.label | password |
7575
| main.go:26:14:26:21 | password | semmle.label | password |
76-
| main.go:29:10:29:17 | password | semmle.label | password |
77-
| main.go:30:15:30:22 | password | semmle.label | password |
78-
| main.go:31:11:31:18 | password | semmle.label | password |
79-
| main.go:32:12:32:19 | password | semmle.label | password |
80-
| main.go:33:10:33:17 | password | semmle.label | password |
81-
| main.go:34:15:34:22 | password | semmle.label | password |
82-
| main.go:35:11:35:18 | password | semmle.label | password |
83-
| main.go:36:12:36:19 | password | semmle.label | password |
84-
| main.go:37:10:37:17 | password | semmle.label | password |
85-
| main.go:38:15:38:22 | password | semmle.label | password |
86-
| main.go:39:11:39:18 | password | semmle.label | password |
87-
| main.go:40:12:40:19 | password | semmle.label | password |
88-
| main.go:41:14:41:21 | password | semmle.label | password |
89-
| main.go:43:12:43:19 | password | semmle.label | password |
90-
| main.go:44:17:44:24 | password | semmle.label | password |
91-
| main.go:51:35:51:42 | password | semmle.label | password |
76+
| main.go:27:16:27:23 | password | semmle.label | password |
77+
| main.go:30:10:30:17 | password | semmle.label | password |
78+
| main.go:31:15:31:22 | password | semmle.label | password |
79+
| main.go:32:11:32:18 | password | semmle.label | password |
80+
| main.go:33:12:33:19 | password | semmle.label | password |
81+
| main.go:34:10:34:17 | password | semmle.label | password |
82+
| main.go:35:15:35:22 | password | semmle.label | password |
83+
| main.go:36:11:36:18 | password | semmle.label | password |
84+
| main.go:37:12:37:19 | password | semmle.label | password |
85+
| main.go:38:10:38:17 | password | semmle.label | password |
86+
| main.go:39:15:39:22 | password | semmle.label | password |
87+
| main.go:40:11:40:18 | password | semmle.label | password |
88+
| main.go:41:12:41:19 | password | semmle.label | password |
89+
| main.go:42:14:42:21 | password | semmle.label | password |
90+
| main.go:44:12:44:19 | password | semmle.label | password |
91+
| main.go:45:17:45:24 | password | semmle.label | password |
92+
| main.go:52:35:52:42 | password | semmle.label | password |
9293
| overrides.go:9:9:9:16 | password | semmle.label | password |
9394
| overrides.go:13:14:13:23 | call to String | semmle.label | call to String |
9495
| passwords.go:8:12:8:12 | definition of x | semmle.label | definition of x |
@@ -170,22 +171,23 @@ subpaths
170171
| main.go:24:17:24:24 | password | main.go:24:17:24:24 | password | main.go:24:17:24:24 | password | $@ flows to a logging call. | main.go:24:17:24:24 | password | Sensitive data returned by an access to password |
171172
| main.go:25:13:25:20 | password | main.go:25:13:25:20 | password | main.go:25:13:25:20 | password | $@ flows to a logging call. | main.go:25:13:25:20 | password | Sensitive data returned by an access to password |
172173
| main.go:26:14:26:21 | password | main.go:26:14:26:21 | password | main.go:26:14:26:21 | password | $@ flows to a logging call. | main.go:26:14:26:21 | password | Sensitive data returned by an access to password |
173-
| main.go:29:10:29:17 | password | main.go:29:10:29:17 | password | main.go:29:10:29:17 | password | $@ flows to a logging call. | main.go:29:10:29:17 | password | Sensitive data returned by an access to password |
174-
| main.go:30:15:30:22 | password | main.go:30:15:30:22 | password | main.go:30:15:30:22 | password | $@ flows to a logging call. | main.go:30:15:30:22 | password | Sensitive data returned by an access to password |
175-
| main.go:31:11:31:18 | password | main.go:31:11:31:18 | password | main.go:31:11:31:18 | password | $@ flows to a logging call. | main.go:31:11:31:18 | password | Sensitive data returned by an access to password |
176-
| main.go:32:12:32:19 | password | main.go:32:12:32:19 | password | main.go:32:12:32:19 | password | $@ flows to a logging call. | main.go:32:12:32:19 | password | Sensitive data returned by an access to password |
177-
| main.go:33:10:33:17 | password | main.go:33:10:33:17 | password | main.go:33:10:33:17 | password | $@ flows to a logging call. | main.go:33:10:33:17 | password | Sensitive data returned by an access to password |
178-
| main.go:34:15:34:22 | password | main.go:34:15:34:22 | password | main.go:34:15:34:22 | password | $@ flows to a logging call. | main.go:34:15:34:22 | password | Sensitive data returned by an access to password |
179-
| main.go:35:11:35:18 | password | main.go:35:11:35:18 | password | main.go:35:11:35:18 | password | $@ flows to a logging call. | main.go:35:11:35:18 | password | Sensitive data returned by an access to password |
180-
| main.go:36:12:36:19 | password | main.go:36:12:36:19 | password | main.go:36:12:36:19 | password | $@ flows to a logging call. | main.go:36:12:36:19 | password | Sensitive data returned by an access to password |
181-
| main.go:37:10:37:17 | password | main.go:37:10:37:17 | password | main.go:37:10:37:17 | password | $@ flows to a logging call. | main.go:37:10:37:17 | password | Sensitive data returned by an access to password |
182-
| main.go:38:15:38:22 | password | main.go:38:15:38:22 | password | main.go:38:15:38:22 | password | $@ flows to a logging call. | main.go:38:15:38:22 | password | Sensitive data returned by an access to password |
183-
| main.go:39:11:39:18 | password | main.go:39:11:39:18 | password | main.go:39:11:39:18 | password | $@ flows to a logging call. | main.go:39:11:39:18 | password | Sensitive data returned by an access to password |
184-
| main.go:40:12:40:19 | password | main.go:40:12:40:19 | password | main.go:40:12:40:19 | password | $@ flows to a logging call. | main.go:40:12:40:19 | password | Sensitive data returned by an access to password |
185-
| main.go:41:14:41:21 | password | main.go:41:14:41:21 | password | main.go:41:14:41:21 | password | $@ flows to a logging call. | main.go:41:14:41:21 | password | Sensitive data returned by an access to password |
186-
| main.go:43:12:43:19 | password | main.go:43:12:43:19 | password | main.go:43:12:43:19 | password | $@ flows to a logging call. | main.go:43:12:43:19 | password | Sensitive data returned by an access to password |
187-
| main.go:44:17:44:24 | password | main.go:44:17:44:24 | password | main.go:44:17:44:24 | password | $@ flows to a logging call. | main.go:44:17:44:24 | password | Sensitive data returned by an access to password |
188-
| main.go:51:35:51:42 | password | main.go:51:35:51:42 | password | main.go:51:35:51:42 | password | $@ flows to a logging call. | main.go:51:35:51:42 | password | Sensitive data returned by an access to password |
174+
| main.go:27:16:27:23 | password | main.go:27:16:27:23 | password | main.go:27:16:27:23 | password | $@ flows to a logging call. | main.go:27:16:27:23 | password | Sensitive data returned by an access to password |
175+
| main.go:30:10:30:17 | password | main.go:30:10:30:17 | password | main.go:30:10:30:17 | password | $@ flows to a logging call. | main.go:30:10:30:17 | password | Sensitive data returned by an access to password |
176+
| main.go:31:15:31:22 | password | main.go:31:15:31:22 | password | main.go:31:15:31:22 | password | $@ flows to a logging call. | main.go:31:15:31:22 | password | Sensitive data returned by an access to password |
177+
| main.go:32:11:32:18 | password | main.go:32:11:32:18 | password | main.go:32:11:32:18 | password | $@ flows to a logging call. | main.go:32:11:32:18 | password | Sensitive data returned by an access to password |
178+
| main.go:33:12:33:19 | password | main.go:33:12:33:19 | password | main.go:33:12:33:19 | password | $@ flows to a logging call. | main.go:33:12:33:19 | password | Sensitive data returned by an access to password |
179+
| main.go:34:10:34:17 | password | main.go:34:10:34:17 | password | main.go:34:10:34:17 | password | $@ flows to a logging call. | main.go:34:10:34:17 | password | Sensitive data returned by an access to password |
180+
| main.go:35:15:35:22 | password | main.go:35:15:35:22 | password | main.go:35:15:35:22 | password | $@ flows to a logging call. | main.go:35:15:35:22 | password | Sensitive data returned by an access to password |
181+
| main.go:36:11:36:18 | password | main.go:36:11:36:18 | password | main.go:36:11:36:18 | password | $@ flows to a logging call. | main.go:36:11:36:18 | password | Sensitive data returned by an access to password |
182+
| main.go:37:12:37:19 | password | main.go:37:12:37:19 | password | main.go:37:12:37:19 | password | $@ flows to a logging call. | main.go:37:12:37:19 | password | Sensitive data returned by an access to password |
183+
| main.go:38:10:38:17 | password | main.go:38:10:38:17 | password | main.go:38:10:38:17 | password | $@ flows to a logging call. | main.go:38:10:38:17 | password | Sensitive data returned by an access to password |
184+
| main.go:39:15:39:22 | password | main.go:39:15:39:22 | password | main.go:39:15:39:22 | password | $@ flows to a logging call. | main.go:39:15:39:22 | password | Sensitive data returned by an access to password |
185+
| main.go:40:11:40:18 | password | main.go:40:11:40:18 | password | main.go:40:11:40:18 | password | $@ flows to a logging call. | main.go:40:11:40:18 | password | Sensitive data returned by an access to password |
186+
| main.go:41:12:41:19 | password | main.go:41:12:41:19 | password | main.go:41:12:41:19 | password | $@ flows to a logging call. | main.go:41:12:41:19 | password | Sensitive data returned by an access to password |
187+
| main.go:42:14:42:21 | password | main.go:42:14:42:21 | password | main.go:42:14:42:21 | password | $@ flows to a logging call. | main.go:42:14:42:21 | password | Sensitive data returned by an access to password |
188+
| main.go:44:12:44:19 | password | main.go:44:12:44:19 | password | main.go:44:12:44:19 | password | $@ flows to a logging call. | main.go:44:12:44:19 | password | Sensitive data returned by an access to password |
189+
| main.go:45:17:45:24 | password | main.go:45:17:45:24 | password | main.go:45:17:45:24 | password | $@ flows to a logging call. | main.go:45:17:45:24 | password | Sensitive data returned by an access to password |
190+
| main.go:52:35:52:42 | password | main.go:52:35:52:42 | password | main.go:52:35:52:42 | password | $@ flows to a logging call. | main.go:52:35:52:42 | password | Sensitive data returned by an access to password |
189191
| overrides.go:13:14:13:23 | call to String | overrides.go:9:9:9:16 | password | overrides.go:13:14:13:23 | call to String | $@ flows to a logging call. | overrides.go:9:9:9:16 | password | Sensitive data returned by an access to password |
190192
| passwords.go:9:14:9:14 | x | passwords.go:30:8:30:15 | password | passwords.go:9:14:9:14 | x | $@ flows to a logging call. | passwords.go:30:8:30:15 | password | Sensitive data returned by an access to password |
191193
| passwords.go:25:14:25:21 | password | passwords.go:25:14:25:21 | password | passwords.go:25:14:25:21 | password | $@ flows to a logging call. | passwords.go:25:14:25:21 | password | Sensitive data returned by an access to password |

go/ql/test/query-tests/Security/CWE-312/main.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ func main() {
2424
log.Panicf("", password)
2525
log.Panicf(password, "")
2626
log.Panicln(password)
27+
log.Output(0, password)
2728

2829
l := log.Default()
2930
l.Print(password)

0 commit comments

Comments
 (0)