Skip to content

Commit d14ee93

Browse files
committed
C++: IR translation for non-runtime-initialized static local variables.
1 parent 4bf03e7 commit d14ee93

File tree

10 files changed

+50
-28
lines changed

10 files changed

+50
-28
lines changed

cpp/ql/lib/semmle/code/cpp/ir/implementation/internal/IRFunctionBase.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ private import IRFunctionBaseInternal
66

77
private newtype TIRFunction =
88
TFunctionIRFunction(Language::Function func) { IRConstruction::Raw::functionHasIR(func) } or
9-
TVarInitIRFunction(Language::GlobalVariable var) { IRConstruction::Raw::varHasIRFunc(var) }
9+
TVarInitIRFunction(Language::Variable var) { IRConstruction::Raw::varHasIRFunc(var) }
1010

1111
/**
1212
* The IR for a function. This base class contains only the predicates that are the same between all

cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/IRConstruction.qll

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,13 @@ module Raw {
3737
predicate functionHasIR(Function func) { exists(getTranslatedFunction(func)) }
3838

3939
cached
40-
predicate varHasIRFunc(GlobalOrNamespaceVariable var) {
40+
predicate varHasIRFunc(Variable var) {
41+
(
42+
var instanceof GlobalOrNamespaceVariable
43+
or
44+
not var.isFromUninstantiatedTemplate(_) and
45+
var instanceof StaticInitializedStaticLocalVariable
46+
) and
4147
var.hasInitializer() and
4248
(
4349
not var.getType().isDeeplyConst()
@@ -75,9 +81,10 @@ module Raw {
7581
}
7682

7783
cached
78-
predicate hasDynamicInitializationFlag(Function func, StaticLocalVariable var, CppType type) {
84+
predicate hasDynamicInitializationFlag(
85+
Function func, RuntimeInitializedStaticLocalVariable var, CppType type
86+
) {
7987
var.getFunction() = func and
80-
var.hasDynamicInitialization() and
8188
type = getBoolType()
8289
}
8390

cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -62,15 +62,6 @@ private predicate ignoreExprAndDescendants(Expr expr) {
6262
// constant value.
6363
isIRConstant(getRealParent(expr))
6464
or
65-
// Only translate the initializer of a static local if it uses run-time data.
66-
// Otherwise the initializer does not run in function scope.
67-
exists(Initializer init, StaticStorageDurationVariable var |
68-
init = var.getInitializer() and
69-
not var.hasDynamicInitialization() and
70-
expr = init.getExpr().getFullyConverted() and
71-
not var instanceof GlobalOrNamespaceVariable
72-
)
73-
or
7465
// Ignore descendants of `__assume` expressions, since we translated these to `NoOp`.
7566
getRealParent(expr) instanceof AssumeExpr
7667
or
@@ -438,6 +429,17 @@ predicate hasTranslatedSyntheticTemporaryObject(Expr expr) {
438429
not expr.hasLValueToRValueConversion()
439430
}
440431

432+
class StaticInitializedStaticLocalVariable extends StaticLocalVariable {
433+
StaticInitializedStaticLocalVariable() {
434+
this.hasInitializer() and
435+
not this.hasDynamicInitialization()
436+
}
437+
}
438+
439+
class RuntimeInitializedStaticLocalVariable extends StaticLocalVariable {
440+
RuntimeInitializedStaticLocalVariable() { this.hasDynamicInitialization() }
441+
}
442+
441443
/**
442444
* Holds if the specified `DeclarationEntry` needs an IR translation. An IR translation is only
443445
* necessary for automatic local variables, or for static local variables with dynamic
@@ -453,7 +455,7 @@ private predicate translateDeclarationEntry(IRDeclarationEntry entry) {
453455
not var.isStatic()
454456
or
455457
// Ignore static variables unless they have a dynamic initializer.
456-
var.(StaticLocalVariable).hasDynamicInitialization()
458+
var instanceof RuntimeInitializedStaticLocalVariable
457459
)
458460
)
459461
}
@@ -755,7 +757,7 @@ newtype TTranslatedElement =
755757
} or
756758
// The side effect that initializes newly-allocated memory.
757759
TTranslatedAllocationSideEffect(AllocationExpr expr) { not ignoreSideEffects(expr) } or
758-
TTranslatedGlobalOrNamespaceVarInit(GlobalOrNamespaceVariable var) { Raw::varHasIRFunc(var) }
760+
TTranslatedStaticStorageDurationVarInit(Variable var) { Raw::varHasIRFunc(var) }
759761

760762
/**
761763
* Gets the index of the first explicitly initialized element in `initList`
@@ -1043,6 +1045,6 @@ abstract class TranslatedRootElement extends TranslatedElement {
10431045
TranslatedRootElement() {
10441046
this instanceof TTranslatedFunction
10451047
or
1046-
this instanceof TTranslatedGlobalOrNamespaceVarInit
1048+
this instanceof TTranslatedStaticStorageDurationVarInit
10471049
}
10481050
}

cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedFunction.qll

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,8 @@ class TranslatedFunction extends TranslatedRootElement, TTranslatedFunction {
322322
(
323323
var instanceof GlobalOrNamespaceVariable
324324
or
325+
var instanceof StaticLocalVariable
326+
or
325327
var instanceof MemberVariable and not var instanceof Field
326328
) and
327329
exists(VariableAccess access |

cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedGlobalVar.qll

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,16 @@ private import TranslatedInitialization
88
private import InstructionTag
99
private import semmle.code.cpp.ir.internal.IRUtilities
1010

11-
class TranslatedGlobalOrNamespaceVarInit extends TranslatedRootElement,
12-
TTranslatedGlobalOrNamespaceVarInit, InitializationContext
11+
class TranslatedStaticStorageDurationVarInit extends TranslatedRootElement,
12+
TTranslatedStaticStorageDurationVarInit, InitializationContext
1313
{
14-
GlobalOrNamespaceVariable var;
14+
Variable var;
1515

16-
TranslatedGlobalOrNamespaceVarInit() { this = TTranslatedGlobalOrNamespaceVarInit(var) }
16+
TranslatedStaticStorageDurationVarInit() { this = TTranslatedStaticStorageDurationVarInit(var) }
1717

1818
override string toString() { result = var.toString() }
1919

20-
final override GlobalOrNamespaceVariable getAst() { result = var }
20+
final override Variable getAst() { result = var }
2121

2222
final override Declaration getFunction() { result = var }
2323

@@ -111,6 +111,8 @@ class TranslatedGlobalOrNamespaceVarInit extends TranslatedRootElement,
111111
(
112112
varUsed instanceof GlobalOrNamespaceVariable
113113
or
114+
varUsed instanceof StaticLocalVariable
115+
or
114116
varUsed instanceof MemberVariable and not varUsed instanceof Field
115117
) and
116118
exists(VariableAccess access |
@@ -128,6 +130,4 @@ class TranslatedGlobalOrNamespaceVarInit extends TranslatedRootElement,
128130
}
129131
}
130132

131-
TranslatedGlobalOrNamespaceVarInit getTranslatedVarInit(GlobalOrNamespaceVariable var) {
132-
result.getAst() = var
133-
}
133+
TranslatedStaticStorageDurationVarInit getTranslatedVarInit(Variable var) { result.getAst() = var }

cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,8 @@ abstract class TranslatedInitialization extends TranslatedElement, TTranslatedIn
139139

140140
final override Declaration getFunction() {
141141
result = expr.getEnclosingFunction() or
142-
result = expr.getEnclosingVariable().(GlobalOrNamespaceVariable)
142+
result = expr.getEnclosingVariable().(GlobalOrNamespaceVariable) or
143+
result = expr.getEnclosingVariable().(StaticInitializedStaticLocalVariable)
143144
}
144145

145146
final override Locatable getAst() { result = expr }
@@ -654,6 +655,8 @@ abstract class TranslatedElementInitialization extends TranslatedElement {
654655
result = initList.getEnclosingFunction()
655656
or
656657
result = initList.getEnclosingVariable().(GlobalOrNamespaceVariable)
658+
or
659+
result = initList.getEnclosingVariable().(StaticInitializedStaticLocalVariable)
657660
}
658661

659662
final override Instruction getFirstInstruction() { result = getInstruction(getElementIndexTag()) }

cpp/ql/lib/semmle/code/cpp/ir/internal/IRCppLanguage.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ class Variable = Cpp::Variable;
4747

4848
class AutomaticVariable = Cpp::StackVariable;
4949

50-
class StaticVariable = Cpp::Variable;
50+
class StaticVariable = Cpp::StaticStorageDurationVariable;
5151

5252
class GlobalVariable = Cpp::GlobalOrNamespaceVariable;
5353

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
private import cpp
12
private import semmle.code.cpp.Print as Print
23

3-
predicate getIdentityString = Print::getIdentityString/1;
4+
string getIdentityString(Declaration decl) {
5+
if decl instanceof StaticLocalVariable
6+
then
7+
exists(StaticLocalVariable v | v = decl | result = v.getType().toString() + " " + v.getName())
8+
else result = Print::getIdentityString(decl)
9+
}

cpp/ql/test/library-tests/ir/ir/PrintConfig.qll

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,5 +18,7 @@ predicate shouldDumpFunction(Declaration decl) {
1818
decl instanceof Function
1919
or
2020
decl.(GlobalOrNamespaceVariable).hasInitializer()
21+
or
22+
decl.(StaticLocalVariable).hasInitializer()
2123
)
2224
}

csharp/ql/src/experimental/ir/implementation/internal/IRFunctionBase.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ private import IRFunctionBaseInternal
66

77
private newtype TIRFunction =
88
TFunctionIRFunction(Language::Function func) { IRConstruction::Raw::functionHasIR(func) } or
9-
TVarInitIRFunction(Language::GlobalVariable var) { IRConstruction::Raw::varHasIRFunc(var) }
9+
TVarInitIRFunction(Language::Variable var) { IRConstruction::Raw::varHasIRFunc(var) }
1010

1111
/**
1212
* The IR for a function. This base class contains only the predicates that are the same between all

0 commit comments

Comments
 (0)