mirror of
https://github.com/github/codeql.git
synced 2025-12-17 01:03:14 +01:00
Merge pull request #293 from geoffw0/zerosizebuffer
CPP: Better handling of zero-sized buffers
This commit is contained in:
@@ -28,3 +28,4 @@
|
|||||||
|
|
||||||
* Added a hash consing library for structural comparison of expressions.
|
* Added a hash consing library for structural comparison of expressions.
|
||||||
* `getBufferSize` now detects variable size structs more reliably.
|
* `getBufferSize` now detects variable size structs more reliably.
|
||||||
|
* Buffer.qll now treats arrays of zero size as a special case.
|
||||||
|
|||||||
@@ -104,9 +104,13 @@ where
|
|||||||
// Some of the functions operate on a larger char type, like `wchar_t`, so we
|
// Some of the functions operate on a larger char type, like `wchar_t`, so we
|
||||||
// need to take this into account in the fixed size case.
|
// need to take this into account in the fixed size case.
|
||||||
charSize = f.getParameter(argDest).getType().getUnspecifiedType().(PointerType).getBaseType().getSize() and
|
charSize = f.getParameter(argDest).getType().getUnspecifiedType().(PointerType).getBaseType().getSize() and
|
||||||
if exists (fc.getArgument(argLimit).getValue().toInt()) then (
|
if exists(fc.getArgument(argLimit).getValue().toInt()) then (
|
||||||
// Fixed sized case
|
// Fixed sized case
|
||||||
arrayExprFixedSize(copyDest) < charSize * fc.getArgument(argLimit).getValue().toInt()
|
exists(int size |
|
||||||
|
size = arrayExprFixedSize(copyDest) and
|
||||||
|
size < charSize * fc.getArgument(argLimit).getValue().toInt() and
|
||||||
|
size != 0 // if the array has zero size, something special is going on
|
||||||
|
)
|
||||||
) else exists (Access takenSizeOf, BufferSizeExpr sizeExpr, int plus |
|
) else exists (Access takenSizeOf, BufferSizeExpr sizeExpr, int plus |
|
||||||
// Variable sized case
|
// Variable sized case
|
||||||
sizeExpr = fc.getArgument(argLimit).getAChild*() and
|
sizeExpr = fc.getArgument(argLimit).getAChild*() and
|
||||||
|
|||||||
@@ -57,7 +57,9 @@ int getBufferSize(Expr bufferExpr, Element why) {
|
|||||||
// buffer is a fixed size array
|
// buffer is a fixed size array
|
||||||
result = bufferVar.getType().getUnspecifiedType().(ArrayType).getSize() and
|
result = bufferVar.getType().getUnspecifiedType().(ArrayType).getSize() and
|
||||||
why = bufferVar and
|
why = bufferVar and
|
||||||
not memberMayBeVarSize(_, bufferVar)
|
not memberMayBeVarSize(_, bufferVar) and
|
||||||
|
not result = 0 // zero sized arrays are likely to have special usage, for example
|
||||||
|
// behaving a bit like a 'union' overlapping other fields.
|
||||||
) or (
|
) or (
|
||||||
// buffer is an initialized array
|
// buffer is an initialized array
|
||||||
// e.g. int buffer[] = {1, 2, 3};
|
// e.g. int buffer[] = {1, 2, 3};
|
||||||
|
|||||||
Reference in New Issue
Block a user