Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit a260607

Browse filesBrowse files
authored
Merge pull request #298 from github/lcartey/improve-static-init-perf
DCL56-CPP: Improve performance
2 parents 5c0f635 + 73cc3a4 commit a260607
Copy full SHA for a260607

File tree

2 files changed

+16
-8
lines changed
Filter options

2 files changed

+16
-8
lines changed
+1Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
* `DCL56-CPP` - performance has been improved for databases with complex initializers.

‎cpp/common/src/codingstandards/cpp/StaticInitialization.qll

Copy file name to clipboardExpand all lines: cpp/common/src/codingstandards/cpp/StaticInitialization.qll
+15-8Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,15 @@ module StaticInitializationGraph {
2727
* - Create a `Node` instance for each injector type.
2828
*/
2929

30+
/**
31+
* Gets an Expr directly or indirectly included in an initializer.
32+
*/
33+
private Expr getAnInitializerExpr(Initializer i) {
34+
result = i.getExpr()
35+
or
36+
result = getAnInitializerExpr(i).getAChild()
37+
}
38+
3039
newtype TNode =
3140
TInitializerNode(Initializer i) {
3241
// This is the initializer of a static storage duration variable
@@ -48,29 +57,29 @@ module StaticInitializationGraph {
4857
} or
4958
TFunctionCallNode(FunctionCall fc) {
5059
// This is a function call that occurs in an initializer called during static initialization
51-
exists(TInitializerNode(any(Initializer i | i.getExpr().getAChild*() = fc)))
60+
exists(TInitializerNode(any(Initializer i | getAnInitializerExpr(i) = fc)))
5261
or
5362
// This is a function call that occurs in a function called during static initialization
5463
exists(
5564
TFunctionNode(any(Function f |
5665
f = fc.getEnclosingFunction() and
5766
// Not in an initializer of a local variable, where the desired flow is instead:
5867
// function -> initializer -> fc
59-
not exists(Initializer i | i.getExpr().getAChild*() = fc)
68+
not exists(Initializer i | getAnInitializerExpr(i) = fc)
6069
))
6170
)
6271
} or
6372
TVariableAccessNode(VariableAccess va) {
6473
// This is a variable that is accessed in an initializer called during static initialization
65-
exists(TInitializerNode(any(Initializer i | i.getExpr().getAChild*() = va)))
74+
exists(TInitializerNode(any(Initializer i | getAnInitializerExpr(i) = va)))
6675
or
6776
// This is a variable that is accessed in a function called during static initialization
6877
exists(
6978
TFunctionNode(any(Function f |
7079
f = va.getEnclosingFunction() and
7180
// Not in an initializer of a local variable, where the desired flow is instead:
7281
// function -> initializer -> va
73-
not exists(Initializer i | i.getExpr().getAChild*() = va)
82+
not exists(Initializer i | getAnInitializerExpr(i) = va)
7483
))
7584
)
7685
}
@@ -149,9 +158,7 @@ module StaticInitializationGraph {
149158
or
150159
// Initializer steps
151160
exists(Initializer i | i = n1.(InitializerNode).getInitializer() |
152-
i.getExpr().getAChild*() = n2.(FunctionCallNode).getFunctionCall()
153-
or
154-
i.getExpr().getAChild*() = n2.(VariableAccessNode).getVariableAccess()
161+
getAnInitializerExpr(i) = n2.getExpr()
155162
)
156163
or
157164
// FunctionCall steps
@@ -169,7 +176,7 @@ module StaticInitializationGraph {
169176
f = n2.getExpr().getEnclosingFunction() and
170177
// But not in an initializer of a local variable, where the desired flow is instead:
171178
// function -> initializer -> expression
172-
not exists(Initializer i | i.getExpr().getAChild*() = n2.getExpr())
179+
not exists(Initializer i | getAnInitializerExpr(i) = n2.getExpr())
173180
or
174181
// `n2` is an initializer of a local scope variable within function `f`
175182
n2.(InitializerNode).getInitializer().getDeclaration().(LocalScopeVariable).getFunction() = f

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.