Skip to content

Commit ae076da

Browse files
authored
Merge pull request github#3112 from dbartol/codeql-c-analysis/34-Bad-Overlap
C++/C#: Fix invalid overlap
2 parents 116c13e + cc76782 commit ae076da

37 files changed

+140
-41
lines changed

cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/IRSanity.qll

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import IRTypeSanity // module is in IRType.qll
55
module InstructionSanity {
66
private import internal.InstructionImports as Imports
77
private import Imports::OperandTag
8+
private import Imports::Overlap
89
private import internal.IRInternal
910

1011
/**
@@ -272,4 +273,18 @@ module InstructionSanity {
272273
func = switchInstr.getEnclosingIRFunction() and
273274
funcText = Language::getIdentityString(func.getFunction())
274275
}
276+
277+
query predicate invalidOverlap(
278+
MemoryOperand useOperand, string message, IRFunction func, string funcText
279+
) {
280+
exists(Overlap overlap |
281+
overlap = useOperand.getDefinitionOverlap() and
282+
overlap instanceof MayPartiallyOverlap and
283+
message =
284+
"MemoryOperand '" + useOperand.toString() + "' has a `getDefinitionOverlap()` of '" +
285+
overlap.toString() + "'." and
286+
func = useOperand.getEnclosingIRFunction() and
287+
funcText = Language::getIdentityString(func.getFunction())
288+
)
289+
}
275290
}

cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/Operand.qll

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,8 @@ class PositionalArgumentOperand extends ArgumentOperand {
384384

385385
class SideEffectOperand extends TypedOperand {
386386
override SideEffectOperandTag tag;
387+
388+
override string toString() { result = "SideEffect" }
387389
}
388390

389391
/**

cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/InstructionImports.qll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ import semmle.code.cpp.ir.implementation.IRType as IRType
33
import semmle.code.cpp.ir.implementation.MemoryAccessKind as MemoryAccessKind
44
import semmle.code.cpp.ir.implementation.Opcode as Opcode
55
import semmle.code.cpp.ir.implementation.internal.OperandTag as OperandTag
6+
import semmle.code.cpp.ir.internal.Overlap as Overlap

cpp/ql/src/semmle/code/cpp/ir/implementation/aliased_ssa/internal/SSAConstruction.qll

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,14 +84,15 @@ private module Cached {
8484
oldOperand instanceof OldIR::NonPhiMemoryOperand and
8585
exists(
8686
OldBlock useBlock, int useRank, Alias::MemoryLocation useLocation,
87-
Alias::MemoryLocation defLocation, OldBlock defBlock, int defRank, int defOffset
87+
Alias::MemoryLocation defLocation, OldBlock defBlock, int defRank, int defOffset,
88+
Alias::MemoryLocation actualDefLocation
8889
|
8990
useLocation = Alias::getOperandMemoryLocation(oldOperand) and
9091
hasUseAtRank(useLocation, useBlock, useRank, oldInstruction) and
9192
definitionReachesUse(useLocation, defBlock, defRank, useBlock, useRank) and
9293
hasDefinitionAtRank(useLocation, defLocation, defBlock, defRank, defOffset) and
93-
instr = getDefinitionOrChiInstruction(defBlock, defOffset, defLocation, _) and
94-
overlap = Alias::getOverlap(defLocation, useLocation)
94+
instr = getDefinitionOrChiInstruction(defBlock, defOffset, defLocation, actualDefLocation) and
95+
overlap = Alias::getOverlap(actualDefLocation, useLocation)
9596
)
9697
}
9798

cpp/ql/src/semmle/code/cpp/ir/implementation/raw/IRSanity.qll

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import IRTypeSanity // module is in IRType.qll
55
module InstructionSanity {
66
private import internal.InstructionImports as Imports
77
private import Imports::OperandTag
8+
private import Imports::Overlap
89
private import internal.IRInternal
910

1011
/**
@@ -272,4 +273,18 @@ module InstructionSanity {
272273
func = switchInstr.getEnclosingIRFunction() and
273274
funcText = Language::getIdentityString(func.getFunction())
274275
}
276+
277+
query predicate invalidOverlap(
278+
MemoryOperand useOperand, string message, IRFunction func, string funcText
279+
) {
280+
exists(Overlap overlap |
281+
overlap = useOperand.getDefinitionOverlap() and
282+
overlap instanceof MayPartiallyOverlap and
283+
message =
284+
"MemoryOperand '" + useOperand.toString() + "' has a `getDefinitionOverlap()` of '" +
285+
overlap.toString() + "'." and
286+
func = useOperand.getEnclosingIRFunction() and
287+
funcText = Language::getIdentityString(func.getFunction())
288+
)
289+
}
275290
}

cpp/ql/src/semmle/code/cpp/ir/implementation/raw/Operand.qll

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,8 @@ class PositionalArgumentOperand extends ArgumentOperand {
384384

385385
class SideEffectOperand extends TypedOperand {
386386
override SideEffectOperandTag tag;
387+
388+
override string toString() { result = "SideEffect" }
387389
}
388390

389391
/**

cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/InstructionImports.qll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ import semmle.code.cpp.ir.implementation.IRType as IRType
33
import semmle.code.cpp.ir.implementation.MemoryAccessKind as MemoryAccessKind
44
import semmle.code.cpp.ir.implementation.Opcode as Opcode
55
import semmle.code.cpp.ir.implementation.internal.OperandTag as OperandTag
6+
import semmle.code.cpp.ir.internal.Overlap as Overlap

cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/IRSanity.qll

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import IRTypeSanity // module is in IRType.qll
55
module InstructionSanity {
66
private import internal.InstructionImports as Imports
77
private import Imports::OperandTag
8+
private import Imports::Overlap
89
private import internal.IRInternal
910

1011
/**
@@ -272,4 +273,18 @@ module InstructionSanity {
272273
func = switchInstr.getEnclosingIRFunction() and
273274
funcText = Language::getIdentityString(func.getFunction())
274275
}
276+
277+
query predicate invalidOverlap(
278+
MemoryOperand useOperand, string message, IRFunction func, string funcText
279+
) {
280+
exists(Overlap overlap |
281+
overlap = useOperand.getDefinitionOverlap() and
282+
overlap instanceof MayPartiallyOverlap and
283+
message =
284+
"MemoryOperand '" + useOperand.toString() + "' has a `getDefinitionOverlap()` of '" +
285+
overlap.toString() + "'." and
286+
func = useOperand.getEnclosingIRFunction() and
287+
funcText = Language::getIdentityString(func.getFunction())
288+
)
289+
}
275290
}

cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/Operand.qll

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,8 @@ class PositionalArgumentOperand extends ArgumentOperand {
384384

385385
class SideEffectOperand extends TypedOperand {
386386
override SideEffectOperandTag tag;
387+
388+
override string toString() { result = "SideEffect" }
387389
}
388390

389391
/**

cpp/ql/src/semmle/code/cpp/ir/implementation/unaliased_ssa/internal/InstructionImports.qll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,4 @@ import semmle.code.cpp.ir.implementation.IRType as IRType
33
import semmle.code.cpp.ir.implementation.MemoryAccessKind as MemoryAccessKind
44
import semmle.code.cpp.ir.implementation.Opcode as Opcode
55
import semmle.code.cpp.ir.implementation.internal.OperandTag as OperandTag
6+
import semmle.code.cpp.ir.internal.Overlap as Overlap

0 commit comments

Comments
 (0)