Skip to content

Commit 2481bc7

Browse files
authored
Merge pull request #72 from dave-bartolomeo/dave/InitMemory
C++: Make `InitializeParameter` and `Uninitialized` return memory results
2 parents 6969466 + f2053c4 commit 2481bc7

File tree

10 files changed

+4629
-4988
lines changed

10 files changed

+4629
-4988
lines changed

cpp/ql/src/semmle/code/cpp/ir/internal/Instruction.qll

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -545,6 +545,10 @@ class InitializeParameterInstruction extends VariableInstruction {
545545
final Parameter getParameter() {
546546
result = var.(IRUserVariable).getVariable()
547547
}
548+
549+
override final MemoryAccessKind getResultMemoryAccess() {
550+
result instanceof IndirectMemoryAccess
551+
}
548552
}
549553

550554
class FieldAddressInstruction extends FieldInstruction {
@@ -561,6 +565,10 @@ class UninitializedInstruction extends Instruction {
561565
UninitializedInstruction() {
562566
opcode instanceof Opcode::Uninitialized
563567
}
568+
569+
override final MemoryAccessKind getResultMemoryAccess() {
570+
result instanceof IndirectMemoryAccess
571+
}
564572
}
565573

566574
class NoOpInstruction extends Instruction {

cpp/ql/src/semmle/code/cpp/ir/internal/InstructionTag.qll

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@ private predicate elementIsInitialized(int elementIndex) {
1717

1818
newtype TInstructionTag =
1919
OnlyInstructionTag() or // Single instruction (not including implicit Load)
20-
InitializerUninitializedTag() or // Source expression of initializer
21-
ParameterInitializerTag() or
2220
InitializeThisTag() or
2321
InitializerVariableAddressTag() or
2422
InitializerLoadStringTag() or
@@ -88,8 +86,6 @@ newtype TInstructionTag =
8886
*/
8987
string getInstructionTagId(TInstructionTag tag) {
9088
tag = OnlyInstructionTag() and result = "Only" or // Single instruction (not including implicit Load)
91-
tag = InitializerUninitializedTag() and result = "InitUninit" or // Source expression of initializer
92-
tag = ParameterInitializerTag() and result = "ParamInit" or
9389
tag = InitializerVariableAddressTag() and result = "InitVarAddr" or
9490
tag = InitializerStoreTag() and result = "InitStore" or
9591
tag = AssignOperationLoadTag() and result = "AssignOpLoad" or

cpp/ql/src/semmle/code/cpp/ir/internal/Opcode.qll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,8 @@ abstract class BuiltInOpcode extends Opcode {}
9292

9393
module Opcode {
9494
class NoOp extends Opcode, TNoOp { override final string toString() { result = "NoOp" } }
95-
class Uninitialized extends Opcode, TUninitialized { override final string toString() { result = "Uninitialized" } }
96-
class InitializeParameter extends Opcode, TInitializeParameter { override final string toString() { result = "InitializeParameter" } }
95+
class Uninitialized extends MemoryAccessOpcode, TUninitialized { override final string toString() { result = "Uninitialized" } }
96+
class InitializeParameter extends MemoryAccessOpcode, TInitializeParameter { override final string toString() { result = "InitializeParameter" } }
9797
class InitializeThis extends Opcode, TInitializeThis { override final string toString() { result = "InitializeThis" } }
9898
class EnterFunction extends Opcode, TEnterFunction { override final string toString() { result = "EnterFunction" } }
9999
class ExitFunction extends Opcode, TExitFunction { override final string toString() { result = "ExitFunction" } }

cpp/ql/src/semmle/code/cpp/ir/internal/TranslatedDeclarationEntry.qll

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,8 @@ abstract class TranslatedVariableDeclaration extends
9898

9999
/**
100100
* Represents the IR translation of a local variable with no initializer. The
101-
* generated IR stores the result of an `Uninitialized` instruction into the
102-
* variable.
101+
* generated IR stores into the variable using an `Uninitialized` instruction,
102+
* rather than a `Store`.
103103
*/
104104
class TranslatedUninitializedVariable extends
105105
TranslatedVariableDeclaration {
@@ -127,12 +127,6 @@ class TranslatedUninitializedVariable extends
127127
) or
128128
(
129129
tag = InitializerStoreTag() and
130-
opcode instanceof Opcode::Store and
131-
resultType = var.getType().getUnspecifiedType() and
132-
isGLValue = false
133-
) or
134-
(
135-
tag = InitializerUninitializedTag() and
136130
opcode instanceof Opcode::Uninitialized and
137131
resultType = var.getType().getUnspecifiedType() and
138132
isGLValue = false
@@ -145,10 +139,6 @@ class TranslatedUninitializedVariable extends
145139
(
146140
(
147141
tag = InitializerVariableAddressTag() and
148-
result = getInstruction(InitializerUninitializedTag())
149-
) or
150-
(
151-
tag = InitializerUninitializedTag() and
152142
result = getInstruction(InitializerStoreTag())
153143
) or
154144
(
@@ -169,11 +159,7 @@ class TranslatedUninitializedVariable extends
169159
(
170160
operandTag instanceof LoadStoreAddressOperand and
171161
result = getInstruction(InitializerVariableAddressTag())
172-
) or
173-
(
174-
operandTag instanceof CopySourceOperand and
175-
result = getInstruction(InitializerUninitializedTag())
176-
)
162+
)
177163
)
178164
}
179165

cpp/ql/src/semmle/code/cpp/ir/internal/TranslatedFunction.qll

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,7 @@ class TranslatedParameter extends TranslatedElement, TTranslatedParameter {
323323
}
324324

325325
override final Instruction getFirstInstruction() {
326-
result = getInstruction(ParameterInitializerTag())
326+
result = getInstruction(InitializerVariableAddressTag())
327327
}
328328

329329
override final TranslatedElement getChild(int id) {
@@ -334,10 +334,6 @@ class TranslatedParameter extends TranslatedElement, TTranslatedParameter {
334334
EdgeKind kind) {
335335
kind instanceof GotoEdge and
336336
(
337-
(
338-
tag = ParameterInitializerTag() and
339-
result = getInstruction(InitializerVariableAddressTag())
340-
) or
341337
(
342338
tag = InitializerVariableAddressTag() and
343339
result = getInstruction(InitializerStoreTag())
@@ -355,12 +351,6 @@ class TranslatedParameter extends TranslatedElement, TTranslatedParameter {
355351

356352
override final predicate hasInstruction(Opcode opcode, InstructionTag tag,
357353
Type resultType, boolean isGLValue) {
358-
(
359-
tag = ParameterInitializerTag() and
360-
opcode instanceof Opcode::InitializeParameter and
361-
resultType = param.getType().getUnspecifiedType() and
362-
isGLValue = false
363-
) or
364354
(
365355
tag = InitializerVariableAddressTag() and
366356
opcode instanceof Opcode::VariableAddress and
@@ -369,15 +359,15 @@ class TranslatedParameter extends TranslatedElement, TTranslatedParameter {
369359
) or
370360
(
371361
tag = InitializerStoreTag() and
372-
opcode instanceof Opcode::Store and
362+
opcode instanceof Opcode::InitializeParameter and
373363
resultType = param.getType().getUnspecifiedType() and
374364
isGLValue = false
375365
)
376366
}
377367

378368
override final IRVariable getInstructionVariable(InstructionTag tag) {
379369
(
380-
tag = ParameterInitializerTag() or
370+
tag = InitializerStoreTag() or
381371
tag = InitializerVariableAddressTag()
382372
) and
383373
result = getIRUserVariable(getFunction(), param)
@@ -390,10 +380,6 @@ class TranslatedParameter extends TranslatedElement, TTranslatedParameter {
390380
(
391381
operandTag instanceof LoadStoreAddressOperand and
392382
result = getInstruction(InitializerVariableAddressTag())
393-
) or
394-
(
395-
operandTag instanceof CopySourceOperand and
396-
result = getInstruction(ParameterInitializerTag())
397383
)
398384
)
399385
}

cpp/ql/src/semmle/code/cpp/ssa/internal/aliased_ssa/Instruction.qll

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -545,6 +545,10 @@ class InitializeParameterInstruction extends VariableInstruction {
545545
final Parameter getParameter() {
546546
result = var.(IRUserVariable).getVariable()
547547
}
548+
549+
override final MemoryAccessKind getResultMemoryAccess() {
550+
result instanceof IndirectMemoryAccess
551+
}
548552
}
549553

550554
class FieldAddressInstruction extends FieldInstruction {
@@ -561,6 +565,10 @@ class UninitializedInstruction extends Instruction {
561565
UninitializedInstruction() {
562566
opcode instanceof Opcode::Uninitialized
563567
}
568+
569+
override final MemoryAccessKind getResultMemoryAccess() {
570+
result instanceof IndirectMemoryAccess
571+
}
564572
}
565573

566574
class NoOpInstruction extends Instruction {

cpp/ql/src/semmle/code/cpp/ssa/internal/ssa/Instruction.qll

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -545,6 +545,10 @@ class InitializeParameterInstruction extends VariableInstruction {
545545
final Parameter getParameter() {
546546
result = var.(IRUserVariable).getVariable()
547547
}
548+
549+
override final MemoryAccessKind getResultMemoryAccess() {
550+
result instanceof IndirectMemoryAccess
551+
}
548552
}
549553

550554
class FieldAddressInstruction extends FieldInstruction {
@@ -561,6 +565,10 @@ class UninitializedInstruction extends Instruction {
561565
UninitializedInstruction() {
562566
opcode instanceof Opcode::Uninitialized
563567
}
568+
569+
override final MemoryAccessKind getResultMemoryAccess() {
570+
result instanceof IndirectMemoryAccess
571+
}
564572
}
565573

566574
class NoOpInstruction extends Instruction {

0 commit comments

Comments
 (0)