Skip to content

Commit dab6691

Browse files
authored
Merge pull request github#2900 from dbartol/dbartol/void-buffer
C++: Better fix for `void` type on buffer access
2 parents ec85f9f + b0fb16c commit dab6691

File tree

4 files changed

+31
-23
lines changed

4 files changed

+31
-23
lines changed

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

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -214,23 +214,28 @@ abstract class IndirectReadOpcode extends IndirectMemoryAccessOpcode {
214214
}
215215

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

223+
/**
224+
* An opcode that accesses a memory buffer of unknown size.
225+
*/
226+
abstract class UnsizedBufferAccessOpcode extends BufferAccessOpcode { }
227+
223228
/**
224229
* An opcode that writes to a memory buffer of unknown size.
225230
*/
226-
abstract class BufferWriteOpcode extends BufferAccessOpcode {
231+
abstract class UnsizedBufferWriteOpcode extends UnsizedBufferAccessOpcode {
227232
final override MemoryAccessKind getWriteMemoryAccess() { result instanceof BufferMemoryAccess }
228233
}
229234

230235
/**
231236
* An opcode that reads from a memory buffer of unknown size.
232237
*/
233-
abstract class BufferReadOpcode extends BufferAccessOpcode {
238+
abstract class UnsizedBufferReadOpcode extends UnsizedBufferAccessOpcode {
234239
final override MemoryAccessKind getReadMemoryAccess() { result instanceof BufferMemoryAccess }
235240
}
236241

@@ -262,9 +267,7 @@ abstract class EntireAllocationReadOpcode extends EntireAllocationAccessOpcode {
262267
/**
263268
* An opcode that accesses a memory buffer whose size is determined by a `BufferSizeOperand`.
264269
*/
265-
abstract class SizedBufferAccessOpcode extends Opcode {
266-
final override predicate hasAddressOperand() { any() }
267-
270+
abstract class SizedBufferAccessOpcode extends BufferAccessOpcode {
268271
final override predicate hasBufferSizeOperand() { any() }
269272
}
270273

@@ -667,17 +670,18 @@ module Opcode {
667670
final override string toString() { result = "IndirectMayWriteSideEffect" }
668671
}
669672

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

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

679-
class BufferMayWriteSideEffect extends WriteSideEffectOpcode, BufferWriteOpcode, MayWriteOpcode,
680-
TBufferMayWriteSideEffect {
683+
class BufferMayWriteSideEffect extends WriteSideEffectOpcode, UnsizedBufferWriteOpcode,
684+
MayWriteOpcode, TBufferMayWriteSideEffect {
681685
final override string toString() { result = "BufferMayWriteSideEffect" }
682686
}
683687

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
@@ -503,7 +503,7 @@ class TranslatedSideEffect extends TranslatedElement, TTranslatedArgumentSideEff
503503
}
504504

505505
override CppType getInstructionOperandType(InstructionTag tag, TypedOperandTag operandTag) {
506-
if hasSpecificReadSideEffect(any(Opcode::BufferReadSideEffect op))
506+
if hasSpecificReadSideEffect(any(BufferAccessOpcode op))
507507
then
508508
result = getUnknownType() and
509509
tag instanceof OnlyInstructionTag and

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

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -214,23 +214,28 @@ abstract class IndirectReadOpcode extends IndirectMemoryAccessOpcode {
214214
}
215215

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

223+
/**
224+
* An opcode that accesses a memory buffer of unknown size.
225+
*/
226+
abstract class UnsizedBufferAccessOpcode extends BufferAccessOpcode { }
227+
223228
/**
224229
* An opcode that writes to a memory buffer of unknown size.
225230
*/
226-
abstract class BufferWriteOpcode extends BufferAccessOpcode {
231+
abstract class UnsizedBufferWriteOpcode extends UnsizedBufferAccessOpcode {
227232
final override MemoryAccessKind getWriteMemoryAccess() { result instanceof BufferMemoryAccess }
228233
}
229234

230235
/**
231236
* An opcode that reads from a memory buffer of unknown size.
232237
*/
233-
abstract class BufferReadOpcode extends BufferAccessOpcode {
238+
abstract class UnsizedBufferReadOpcode extends UnsizedBufferAccessOpcode {
234239
final override MemoryAccessKind getReadMemoryAccess() { result instanceof BufferMemoryAccess }
235240
}
236241

@@ -262,9 +267,7 @@ abstract class EntireAllocationReadOpcode extends EntireAllocationAccessOpcode {
262267
/**
263268
* An opcode that accesses a memory buffer whose size is determined by a `BufferSizeOperand`.
264269
*/
265-
abstract class SizedBufferAccessOpcode extends Opcode {
266-
final override predicate hasAddressOperand() { any() }
267-
270+
abstract class SizedBufferAccessOpcode extends BufferAccessOpcode {
268271
final override predicate hasBufferSizeOperand() { any() }
269272
}
270273

@@ -667,17 +670,18 @@ module Opcode {
667670
final override string toString() { result = "IndirectMayWriteSideEffect" }
668671
}
669672

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

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

679-
class BufferMayWriteSideEffect extends WriteSideEffectOpcode, BufferWriteOpcode, MayWriteOpcode,
680-
TBufferMayWriteSideEffect {
683+
class BufferMayWriteSideEffect extends WriteSideEffectOpcode, UnsizedBufferWriteOpcode,
684+
MayWriteOpcode, TBufferMayWriteSideEffect {
681685
final override string toString() { result = "BufferMayWriteSideEffect" }
682686
}
683687

0 commit comments

Comments
 (0)