Skip to content

Commit 170331b

Browse files
author
Dave Bartolomeo
committed
C++: Better fix for void type on buffer access
Fixes issue https://github.com/github/codeql-c-analysis-team/issues/20 This change undoes the workaround in github#2736, and replaces it with a fix for the underlying cause. The problem was that the IR construction code for side effects incorrectly assumed that `BufferAccessOpcode` included `SizedBufferAccessOpcode`. I think that was actually a perfectly reasonable assumption to make, so I changed the `Opcode` hierarchy to make it true.
1 parent de66841 commit 170331b

File tree

4 files changed

+29
-21
lines changed

4 files changed

+29
-21
lines changed

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

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -213,23 +213,29 @@ abstract class IndirectReadOpcode extends IndirectMemoryAccessOpcode {
213213
}
214214

215215
/**
216-
* An opcode that accesses a memory buffer of unknown size.
216+
* An opcode that accesses a memory buffer.
217217
*/
218218
abstract class BufferAccessOpcode extends Opcode {
219219
final override predicate hasAddressOperand() { any() }
220220
}
221221

222+
/**
223+
* An opcode that accesses a memory buffer of unknown size.
224+
*/
225+
abstract class UnsizedBufferAccessOpcode extends BufferAccessOpcode {
226+
}
227+
222228
/**
223229
* An opcode that writes to a memory buffer of unknown size.
224230
*/
225-
abstract class BufferWriteOpcode extends BufferAccessOpcode {
231+
abstract class UnsizedBufferWriteOpcode extends UnsizedBufferAccessOpcode {
226232
final override MemoryAccessKind getWriteMemoryAccess() { result instanceof BufferMemoryAccess }
227233
}
228234

229235
/**
230236
* An opcode that reads from a memory buffer of unknown size.
231237
*/
232-
abstract class BufferReadOpcode extends BufferAccessOpcode {
238+
abstract class UnsizedBufferReadOpcode extends UnsizedBufferAccessOpcode {
233239
final override MemoryAccessKind getReadMemoryAccess() { result instanceof BufferMemoryAccess }
234240
}
235241

@@ -261,9 +267,7 @@ abstract class EntireAllocationReadOpcode extends EntireAllocationAccessOpcode {
261267
/**
262268
* An opcode that accesses a memory buffer whose size is determined by a `BufferSizeOperand`.
263269
*/
264-
abstract class SizedBufferAccessOpcode extends Opcode {
265-
final override predicate hasAddressOperand() { any() }
266-
270+
abstract class SizedBufferAccessOpcode extends BufferAccessOpcode {
267271
final override predicate hasBufferSizeOperand() { any() }
268272
}
269273

@@ -666,16 +670,16 @@ module Opcode {
666670
final override string toString() { result = "IndirectMayWriteSideEffect" }
667671
}
668672

669-
class BufferReadSideEffect extends ReadSideEffectOpcode, BufferReadOpcode, TBufferReadSideEffect {
673+
class BufferReadSideEffect extends ReadSideEffectOpcode, UnsizedBufferReadOpcode, TBufferReadSideEffect {
670674
final override string toString() { result = "BufferReadSideEffect" }
671675
}
672676

673-
class BufferMustWriteSideEffect extends WriteSideEffectOpcode, BufferWriteOpcode,
677+
class BufferMustWriteSideEffect extends WriteSideEffectOpcode, UnsizedBufferWriteOpcode,
674678
TBufferMustWriteSideEffect {
675679
final override string toString() { result = "BufferMustWriteSideEffect" }
676680
}
677681

678-
class BufferMayWriteSideEffect extends WriteSideEffectOpcode, BufferWriteOpcode, MayWriteOpcode,
682+
class BufferMayWriteSideEffect extends WriteSideEffectOpcode, UnsizedBufferWriteOpcode, MayWriteOpcode,
679683
TBufferMayWriteSideEffect {
680684
final override string toString() { result = "BufferMayWriteSideEffect" }
681685
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ private predicate hasResultMemoryAccess(
2626
type = languageType.getIRType() and
2727
isIndirectOrBufferMemoryAccess(instr.getResultMemoryAccess()) and
2828
(if instr.hasResultMayMemoryAccess() then isMayAccess = true else isMayAccess = false) and
29-
if type.getByteSize() > 0
29+
if exists(type.getByteSize())
3030
then endBitOffset = Ints::add(startBitOffset, Ints::mul(type.getByteSize(), 8))
3131
else endBitOffset = Ints::unknown()
3232
)
@@ -43,7 +43,7 @@ private predicate hasOperandMemoryAccess(
4343
type = languageType.getIRType() and
4444
isIndirectOrBufferMemoryAccess(operand.getMemoryAccess()) and
4545
(if operand.hasMayReadMemoryAccess() then isMayAccess = true else isMayAccess = false) and
46-
if type.getByteSize() > 0
46+
if exists(type.getByteSize())
4747
then endBitOffset = Ints::add(startBitOffset, Ints::mul(type.getByteSize(), 8))
4848
else endBitOffset = Ints::unknown()
4949
)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -487,7 +487,7 @@ class TranslatedSideEffect extends TranslatedElement, TTranslatedArgumentSideEff
487487
}
488488

489489
override CppType getInstructionOperandType(InstructionTag tag, TypedOperandTag operandTag) {
490-
if hasSpecificReadSideEffect(any(Opcode::BufferReadSideEffect op))
490+
if hasSpecificReadSideEffect(any(BufferAccessOpcode op))
491491
then
492492
result = getUnknownType() and
493493
tag instanceof OnlyInstructionTag and

csharp/ql/src/semmle/code/csharp/ir/implementation/Opcode.qll

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -213,23 +213,29 @@ abstract class IndirectReadOpcode extends IndirectMemoryAccessOpcode {
213213
}
214214

215215
/**
216-
* An opcode that accesses a memory buffer of unknown size.
216+
* An opcode that accesses a memory buffer.
217217
*/
218218
abstract class BufferAccessOpcode extends Opcode {
219219
final override predicate hasAddressOperand() { any() }
220220
}
221221

222+
/**
223+
* An opcode that accesses a memory buffer of unknown size.
224+
*/
225+
abstract class UnsizedBufferAccessOpcode extends BufferAccessOpcode {
226+
}
227+
222228
/**
223229
* An opcode that writes to a memory buffer of unknown size.
224230
*/
225-
abstract class BufferWriteOpcode extends BufferAccessOpcode {
231+
abstract class UnsizedBufferWriteOpcode extends UnsizedBufferAccessOpcode {
226232
final override MemoryAccessKind getWriteMemoryAccess() { result instanceof BufferMemoryAccess }
227233
}
228234

229235
/**
230236
* An opcode that reads from a memory buffer of unknown size.
231237
*/
232-
abstract class BufferReadOpcode extends BufferAccessOpcode {
238+
abstract class UnsizedBufferReadOpcode extends UnsizedBufferAccessOpcode {
233239
final override MemoryAccessKind getReadMemoryAccess() { result instanceof BufferMemoryAccess }
234240
}
235241

@@ -261,9 +267,7 @@ abstract class EntireAllocationReadOpcode extends EntireAllocationAccessOpcode {
261267
/**
262268
* An opcode that accesses a memory buffer whose size is determined by a `BufferSizeOperand`.
263269
*/
264-
abstract class SizedBufferAccessOpcode extends Opcode {
265-
final override predicate hasAddressOperand() { any() }
266-
270+
abstract class SizedBufferAccessOpcode extends BufferAccessOpcode {
267271
final override predicate hasBufferSizeOperand() { any() }
268272
}
269273

@@ -666,16 +670,16 @@ module Opcode {
666670
final override string toString() { result = "IndirectMayWriteSideEffect" }
667671
}
668672

669-
class BufferReadSideEffect extends ReadSideEffectOpcode, BufferReadOpcode, TBufferReadSideEffect {
673+
class BufferReadSideEffect extends ReadSideEffectOpcode, UnsizedBufferReadOpcode, TBufferReadSideEffect {
670674
final override string toString() { result = "BufferReadSideEffect" }
671675
}
672676

673-
class BufferMustWriteSideEffect extends WriteSideEffectOpcode, BufferWriteOpcode,
677+
class BufferMustWriteSideEffect extends WriteSideEffectOpcode, UnsizedBufferWriteOpcode,
674678
TBufferMustWriteSideEffect {
675679
final override string toString() { result = "BufferMustWriteSideEffect" }
676680
}
677681

678-
class BufferMayWriteSideEffect extends WriteSideEffectOpcode, BufferWriteOpcode, MayWriteOpcode,
682+
class BufferMayWriteSideEffect extends WriteSideEffectOpcode, UnsizedBufferWriteOpcode, MayWriteOpcode,
679683
TBufferMayWriteSideEffect {
680684
final override string toString() { result = "BufferMayWriteSideEffect" }
681685
}

0 commit comments

Comments
 (0)