mirror of
https://github.com/github/codeql.git
synced 2025-12-16 16:53:25 +01:00
175 lines
6.5 KiB
Plaintext
175 lines
6.5 KiB
Plaintext
import cpp
|
|
import semmle.code.cpp.models.implementations.Allocation
|
|
import semmle.code.cpp.Print
|
|
|
|
query predicate newExprs(
|
|
NewExpr expr, string type, string sig, int size, int alignment, string form, string placement
|
|
) {
|
|
exists(Function allocator, Type allocatedType |
|
|
expr.getAllocator() = allocator and
|
|
sig = getIdentityString(allocator) and
|
|
allocatedType = expr.getAllocatedType() and
|
|
type = allocatedType.toString() and
|
|
size = allocatedType.getSize() and
|
|
alignment = allocatedType.getAlignment() and
|
|
(if expr.hasAlignedAllocation() then form = "aligned" else form = "") and
|
|
if exists(expr.getPlacementPointer())
|
|
then placement = expr.getPlacementPointer().toString()
|
|
else placement = ""
|
|
)
|
|
}
|
|
|
|
query predicate newArrayExprs(
|
|
NewArrayExpr expr, string t1, string t2, string sig, int size, int alignment, string form,
|
|
string extents, string placement
|
|
) {
|
|
exists(Function allocator, Type arrayType, Type elementType |
|
|
expr.getAllocator() = allocator and
|
|
sig = getIdentityString(allocator) and
|
|
arrayType = expr.getAllocatedType() and
|
|
t1 = arrayType.toString() and
|
|
elementType = expr.getAllocatedElementType() and
|
|
t2 = elementType.toString() and
|
|
size = elementType.getSize() and
|
|
alignment = elementType.getAlignment() and
|
|
(if expr.hasAlignedAllocation() then form = "aligned" else form = "") and
|
|
extents = concat(Expr e | e = expr.getExtent() | e.toString(), ", ") and
|
|
if exists(expr.getPlacementPointer())
|
|
then placement = expr.getPlacementPointer().toString()
|
|
else placement = ""
|
|
)
|
|
}
|
|
|
|
query predicate newExprDeallocators(
|
|
NewExpr expr, string type, string sig, int size, int alignment, string form
|
|
) {
|
|
exists(Function deallocator, Type allocatedType |
|
|
expr.getDeallocator() = deallocator and
|
|
sig = getIdentityString(deallocator) and
|
|
allocatedType = expr.getAllocatedType() and
|
|
type = allocatedType.toString() and
|
|
size = allocatedType.getSize() and
|
|
alignment = allocatedType.getAlignment() and
|
|
exists(string sized, string aligned, string destroying |
|
|
(if expr.hasAlignedDeallocation() then aligned = "aligned" else aligned = "") and
|
|
(if expr.hasSizedDeallocation() then sized = "sized" else sized = "") and
|
|
(if expr.isDestroyingDeleteDeallocation() then destroying = "destroying" else destroying = "") and
|
|
form = sized + " " + aligned + " " + destroying
|
|
)
|
|
)
|
|
}
|
|
|
|
query predicate newArrayExprDeallocators(
|
|
NewArrayExpr expr, string type, string sig, int size, int alignment, string form
|
|
) {
|
|
exists(Function deallocator, Type elementType |
|
|
expr.getDeallocator() = deallocator and
|
|
sig = getIdentityString(deallocator) and
|
|
elementType = expr.getAllocatedElementType() and
|
|
type = elementType.toString() and
|
|
size = elementType.getSize() and
|
|
alignment = elementType.getAlignment() and
|
|
exists(string sized, string aligned, string destroying |
|
|
(if expr.hasAlignedDeallocation() then aligned = "aligned" else aligned = "") and
|
|
(if expr.hasSizedDeallocation() then sized = "sized" else sized = "") and
|
|
(if expr.isDestroyingDeleteDeallocation() then destroying = "destroying" else destroying = "") and
|
|
form = sized + " " + aligned + " " + destroying
|
|
)
|
|
)
|
|
}
|
|
|
|
query predicate deleteExprs(
|
|
DeleteExpr expr, string type, string sig, int size, int alignment, string form,
|
|
boolean hasDeallocatorCall
|
|
) {
|
|
exists(Function deallocator, Type deletedType |
|
|
expr.getDeallocator() = deallocator and
|
|
sig = getIdentityString(deallocator) and
|
|
deletedType = expr.getDeletedObjectType() and
|
|
type = deletedType.toString() and
|
|
size = deletedType.getSize() and
|
|
alignment = deletedType.getAlignment() and
|
|
exists(string sized, string aligned, string destroying |
|
|
(if expr.hasAlignedDeallocation() then aligned = "aligned" else aligned = "") and
|
|
(if expr.hasSizedDeallocation() then sized = "sized" else sized = "") and
|
|
(if expr.isDestroyingDeleteDeallocation() then destroying = "destroying" else destroying = "") and
|
|
form = sized + " " + aligned + " " + destroying
|
|
) and
|
|
if exists(expr.getDeallocatorCall())
|
|
then hasDeallocatorCall = true
|
|
else hasDeallocatorCall = false
|
|
)
|
|
}
|
|
|
|
query predicate deleteArrayExprs(
|
|
DeleteArrayExpr expr, string type, string sig, int size, int alignment, string form
|
|
) {
|
|
exists(Function deallocator, Type elementType |
|
|
expr.getDeallocator() = deallocator and
|
|
sig = getIdentityString(deallocator) and
|
|
elementType = expr.getDeletedElementType() and
|
|
type = elementType.toString() and
|
|
size = elementType.getSize() and
|
|
alignment = elementType.getAlignment() and
|
|
exists(string sized, string aligned, string destroying |
|
|
(if expr.hasAlignedDeallocation() then aligned = "aligned" else aligned = "") and
|
|
(if expr.hasSizedDeallocation() then sized = "sized" else sized = "") and
|
|
(if expr.isDestroyingDeleteDeallocation() then destroying = "destroying" else destroying = "") and
|
|
form = sized + " " + aligned + " " + destroying
|
|
)
|
|
)
|
|
}
|
|
|
|
string describeAllocationFunction(AllocationFunction f) {
|
|
result = "getSizeArg = " + f.getSizeArg().toString()
|
|
or
|
|
result = "getSizeMult = " + f.getSizeMult().toString()
|
|
or
|
|
result = "getReallocPtrArg = " + f.getReallocPtrArg().toString()
|
|
or
|
|
f.requiresDealloc() and
|
|
result = "requiresDealloc"
|
|
or
|
|
result =
|
|
"getPlacementArgument = " + f.(OperatorNewAllocationFunction).getPlacementArgument().toString()
|
|
}
|
|
|
|
query predicate allocationFunctions(AllocationFunction f, string descr) {
|
|
descr = concat(describeAllocationFunction(f), ", ")
|
|
}
|
|
|
|
string describeAllocationExpr(AllocationExpr e) {
|
|
result = "getSizeExpr = " + e.getSizeExpr().toString()
|
|
or
|
|
result = "getSizeMult = " + e.getSizeMult().toString()
|
|
or
|
|
result = "getSizeBytes = " + e.getSizeBytes().toString()
|
|
or
|
|
result = "getReallocPtr = " + e.getReallocPtr().toString()
|
|
or
|
|
result = "getAllocatedElementType = " + e.getAllocatedElementType().toString()
|
|
or
|
|
e.requiresDealloc() and
|
|
result = "requiresDealloc"
|
|
}
|
|
|
|
query predicate allocationExprs(AllocationExpr e, string descr) {
|
|
descr = concat(describeAllocationExpr(e), ", ")
|
|
}
|
|
|
|
string describeDeallocationFunction(DeallocationFunction f) {
|
|
result = "getFreedArg = " + f.getFreedArg().toString()
|
|
}
|
|
|
|
query predicate deallocationFunctions(DeallocationFunction f, string descr) {
|
|
descr = concat(describeDeallocationFunction(f), ", ")
|
|
}
|
|
|
|
string describeDeallocationExpr(DeallocationExpr e) {
|
|
result = "getFreedExpr = " + e.getFreedExpr().toString()
|
|
}
|
|
|
|
query predicate deallocationExprs(DeallocationExpr e, string descr) {
|
|
descr = concat(describeDeallocationExpr(e), ", ")
|
|
}
|