mirror of
https://github.com/github/codeql.git
synced 2026-04-29 18:55:14 +02:00
C++/C#: Blob -> Opaque
This commit is contained in:
@@ -28,8 +28,8 @@ private newtype TIRType =
|
||||
TIRFunctionAddressType(int byteSize) {
|
||||
Language::hasFunctionAddressType(byteSize)
|
||||
} or
|
||||
TIRBlobType(Language::BlobTypeTag tag, int byteSize) {
|
||||
Language::hasBlobType(tag, byteSize)
|
||||
TIROpaqueType(Language::OpaqueTypeTag tag, int byteSize) {
|
||||
Language::hasOpaqueType(tag, byteSize)
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -118,7 +118,7 @@ private class IRSizedType extends IRType {
|
||||
this = TIRFloatingPointType(byteSize) or
|
||||
this = TIRAddressType(byteSize) or
|
||||
this = TIRFunctionAddressType(byteSize) or
|
||||
this = TIRBlobType(_, byteSize)
|
||||
this = TIROpaqueType(_, byteSize)
|
||||
}
|
||||
|
||||
final override int getByteSize() { result = byteSize }
|
||||
@@ -212,30 +212,30 @@ class IRFunctionAddressType extends IRSizedType, TIRFunctionAddressType {
|
||||
* A type with known size that does not fit any of the other kinds of type. Used to represent
|
||||
* classes, structs, unions, fixed-size arrays, pointers-to-member, and more.
|
||||
*/
|
||||
class IRBlobType extends IRSizedType, TIRBlobType {
|
||||
Language::BlobTypeTag tag;
|
||||
class IROpaqueType extends IRSizedType, TIROpaqueType {
|
||||
Language::OpaqueTypeTag tag;
|
||||
|
||||
IRBlobType() {
|
||||
this = TIRBlobType(tag, byteSize)
|
||||
IROpaqueType() {
|
||||
this = TIROpaqueType(tag, byteSize)
|
||||
}
|
||||
|
||||
final override string toString() {
|
||||
result = "blob" + byteSize.toString() + "{" + tag.toString() + "}"
|
||||
result = "opaque" + byteSize.toString() + "{" + tag.toString() + "}"
|
||||
}
|
||||
|
||||
final override string getIdentityString() {
|
||||
result = "blob" + byteSize.toString() + "{" + Language::getBlobTagIdentityString(tag) + "}"
|
||||
result = "opaque" + byteSize.toString() + "{" + Language::getOpaqueTagIdentityString(tag) + "}"
|
||||
}
|
||||
|
||||
final override Language::LanguageType getCanonicalLanguageType() {
|
||||
result = Language::getCanonicalBlobType(tag, byteSize)
|
||||
result = Language::getCanonicalOpaqueType(tag, byteSize)
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the "tag" that differentiates this type from other incompatible blob types that have the
|
||||
* Gets the "tag" that differentiates this type from other incompatible opaque types that have the
|
||||
* same size.
|
||||
*/
|
||||
final Language::BlobTypeTag getTag() { result = tag }
|
||||
final Language::OpaqueTypeTag getTag() { result = tag }
|
||||
}
|
||||
|
||||
module IRTypeSanity {
|
||||
|
||||
@@ -304,9 +304,9 @@ private module Cached {
|
||||
}
|
||||
|
||||
cached
|
||||
predicate needsUnknownBlobType(int byteSize) {
|
||||
predicate needsUnknownOpaqueType(int byteSize) {
|
||||
exists(TranslatedElement element |
|
||||
element.needsUnknownBlobType(byteSize)
|
||||
element.needsUnknownOpaqueType(byteSize)
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -616,7 +616,7 @@ abstract class TranslatedElement extends TTranslatedElement {
|
||||
*/
|
||||
int getInstructionResultSize(InstructionTag tag) { none() }
|
||||
|
||||
predicate needsUnknownBlobType(int byteSize) { none() }
|
||||
predicate needsUnknownOpaqueType(int byteSize) { none() }
|
||||
|
||||
/**
|
||||
* If the instruction specified by `tag` is a `StringConstantInstruction`,
|
||||
|
||||
@@ -205,7 +205,7 @@ class TranslatedStringLiteralInitialization extends TranslatedDirectInitializati
|
||||
// space in the target array.
|
||||
tag = ZeroPadStringConstantTag() and
|
||||
opcode instanceof Opcode::Constant and
|
||||
resultType = getUnknownBlobType(elementCount * getElementType().getSize())
|
||||
resultType = getUnknownOpaqueType(elementCount * getElementType().getSize())
|
||||
or
|
||||
// The index of the first element to be zero initialized.
|
||||
tag = ZeroPadStringElementIndexTag() and
|
||||
@@ -220,7 +220,7 @@ class TranslatedStringLiteralInitialization extends TranslatedDirectInitializati
|
||||
// Store the constant zero into the remainder of the string.
|
||||
tag = ZeroPadStringStoreTag() and
|
||||
opcode instanceof Opcode::Store and
|
||||
resultType = getUnknownBlobType(elementCount * getElementType().getSize())
|
||||
resultType = getUnknownOpaqueType(elementCount * getElementType().getSize())
|
||||
)
|
||||
)
|
||||
}
|
||||
@@ -314,7 +314,7 @@ class TranslatedStringLiteralInitialization extends TranslatedDirectInitializati
|
||||
)
|
||||
}
|
||||
|
||||
override predicate needsUnknownBlobType(int byteSize) {
|
||||
override predicate needsUnknownOpaqueType(int byteSize) {
|
||||
exists(int elementCount |
|
||||
zeroInitRange(_, elementCount) and
|
||||
byteSize = elementCount * getElementType().getSize()
|
||||
@@ -704,7 +704,7 @@ class TranslatedElementValueInitialization extends TranslatedElementInitializati
|
||||
|
||||
override int getElementIndex() { result = elementIndex }
|
||||
|
||||
override predicate needsUnknownBlobType(int byteSize) {
|
||||
override predicate needsUnknownOpaqueType(int byteSize) {
|
||||
elementCount != 0 and byteSize = elementCount * getElementType().getSize()
|
||||
}
|
||||
|
||||
@@ -720,7 +720,7 @@ class TranslatedElementValueInitialization extends TranslatedElementInitializati
|
||||
if elementCount = 1 then
|
||||
result = getTypeForPRValue(getElementType())
|
||||
else
|
||||
result = getUnknownBlobType(elementCount * getElementType().getSize())
|
||||
result = getUnknownOpaqueType(elementCount * getElementType().getSize())
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -119,7 +119,7 @@ predicate hasFunctionAddressType(int byteSize) {
|
||||
byteSize = getTypeSize(any(FunctionPointerIshType type))
|
||||
}
|
||||
|
||||
private predicate isBlobType(Type type) {
|
||||
private predicate isOpaqueType(Type type) {
|
||||
(
|
||||
exists(type.getSize()) and // Only include complete types
|
||||
(
|
||||
@@ -132,12 +132,12 @@ private predicate isBlobType(Type type) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if an `IRBlobType` with the specified `tag` and `byteSize` should exist.
|
||||
* Holds if an `IROpaqueType` with the specified `tag` and `byteSize` should exist.
|
||||
*/
|
||||
predicate hasBlobType(Type tag, int byteSize) {
|
||||
isBlobType(tag) and byteSize = getTypeSize(tag)
|
||||
predicate hasOpaqueType(Type tag, int byteSize) {
|
||||
isOpaqueType(tag) and byteSize = getTypeSize(tag)
|
||||
or
|
||||
tag instanceof UnknownType and IRConstruction::needsUnknownBlobType(byteSize)
|
||||
tag instanceof UnknownType and IRConstruction::needsUnknownOpaqueType(byteSize)
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -147,11 +147,11 @@ private IRType getIRTypeForPRValue(Type type) {
|
||||
exists(Type unspecifiedType |
|
||||
unspecifiedType = type.getUnspecifiedType() |
|
||||
(
|
||||
isBlobType(unspecifiedType) and
|
||||
exists(IRBlobType blobType |
|
||||
blobType = result |
|
||||
blobType.getByteSize() = getTypeSize(type) and
|
||||
blobType.getTag() = unspecifiedType
|
||||
isOpaqueType(unspecifiedType) and
|
||||
exists(IROpaqueType opaqueType |
|
||||
opaqueType = result |
|
||||
opaqueType.getByteSize() = getTypeSize(type) and
|
||||
opaqueType.getTag() = unspecifiedType
|
||||
)
|
||||
) or
|
||||
unspecifiedType instanceof BoolType and result.(IRBooleanType).getByteSize() = type.getSize() or
|
||||
@@ -174,8 +174,8 @@ private newtype TCppType =
|
||||
TGLValueAddressType(Type type) {
|
||||
any()
|
||||
} or
|
||||
TUnknownBlobType(int byteSize) {
|
||||
IRConstruction::needsUnknownBlobType(byteSize)
|
||||
TUnknownOpaqueType(int byteSize) {
|
||||
IRConstruction::needsUnknownOpaqueType(byteSize)
|
||||
} or
|
||||
TUnknownType()
|
||||
|
||||
@@ -253,18 +253,18 @@ private class CppPRValueType extends CppWrappedType, TPRValueType {
|
||||
* occur in certain cases during IR construction, such as the type of a zero-initialized segment of
|
||||
* a partially-initialized array.
|
||||
*/
|
||||
private class CppUnknownBlobType extends CppType, TUnknownBlobType {
|
||||
private class CppUnknownOpaqueType extends CppType, TUnknownOpaqueType {
|
||||
int byteSize;
|
||||
|
||||
CppUnknownBlobType() {
|
||||
this = TUnknownBlobType(byteSize)
|
||||
CppUnknownOpaqueType() {
|
||||
this = TUnknownOpaqueType(byteSize)
|
||||
}
|
||||
|
||||
override final string toString() {
|
||||
result = "unknown[" + byteSize.toString() + "]"
|
||||
}
|
||||
|
||||
override final IRBlobType getIRType() {
|
||||
override final IROpaqueType getIRType() {
|
||||
result.getByteSize() = byteSize
|
||||
}
|
||||
|
||||
@@ -397,9 +397,9 @@ CppFunctionGLValueType getFunctionGLValueType() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the `CppType` that represents a blob of unknown type with size `byteSize`.
|
||||
* Gets the `CppType` that represents a opaque of unknown type with size `byteSize`.
|
||||
*/
|
||||
CppUnknownBlobType getUnknownBlobType(int byteSize) {
|
||||
CppUnknownOpaqueType getUnknownOpaqueType(int byteSize) {
|
||||
result.getByteSize() = byteSize
|
||||
}
|
||||
|
||||
@@ -512,22 +512,22 @@ CppPRValueType getCanonicalVoidType() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the `CppType` that is the canonical type for an `IRBlobType` with the specified `tag` and
|
||||
* Gets the `CppType` that is the canonical type for an `IROpaqueType` with the specified `tag` and
|
||||
* `byteSize`.
|
||||
*/
|
||||
CppType getCanonicalBlobType(Type tag, int byteSize) {
|
||||
isBlobType(tag) and
|
||||
CppType getCanonicalOpaqueType(Type tag, int byteSize) {
|
||||
isOpaqueType(tag) and
|
||||
result = TPRValueType(tag.getUnspecifiedType()) and
|
||||
getTypeSize(tag) = byteSize
|
||||
or
|
||||
tag instanceof UnknownType and result = getUnknownBlobType(byteSize)
|
||||
tag instanceof UnknownType and result = getUnknownOpaqueType(byteSize)
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a string that uniquely identifies an `IRBlobType` tag. This may be different from the usual
|
||||
* Gets a string that uniquely identifies an `IROpaqueType` tag. This may be different from the usual
|
||||
* `toString()` of the tag in order to ensure uniqueness.
|
||||
*/
|
||||
string getBlobTagIdentityString(Type tag) {
|
||||
hasBlobType(tag, _) and
|
||||
string getOpaqueTagIdentityString(Type tag) {
|
||||
hasOpaqueType(tag, _) and
|
||||
result = getTypeIdentityString(tag)
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@ import CppType
|
||||
|
||||
class LanguageType = CppType;
|
||||
|
||||
class BlobTypeTag = Cpp::Type;
|
||||
class OpaqueTypeTag = Cpp::Type;
|
||||
|
||||
class Function = Cpp::Function;
|
||||
|
||||
|
||||
@@ -28,8 +28,8 @@ private newtype TIRType =
|
||||
TIRFunctionAddressType(int byteSize) {
|
||||
Language::hasFunctionAddressType(byteSize)
|
||||
} or
|
||||
TIRBlobType(Language::BlobTypeTag tag, int byteSize) {
|
||||
Language::hasBlobType(tag, byteSize)
|
||||
TIROpaqueType(Language::OpaqueTypeTag tag, int byteSize) {
|
||||
Language::hasOpaqueType(tag, byteSize)
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -118,7 +118,7 @@ private class IRSizedType extends IRType {
|
||||
this = TIRFloatingPointType(byteSize) or
|
||||
this = TIRAddressType(byteSize) or
|
||||
this = TIRFunctionAddressType(byteSize) or
|
||||
this = TIRBlobType(_, byteSize)
|
||||
this = TIROpaqueType(_, byteSize)
|
||||
}
|
||||
|
||||
final override int getByteSize() { result = byteSize }
|
||||
@@ -212,30 +212,30 @@ class IRFunctionAddressType extends IRSizedType, TIRFunctionAddressType {
|
||||
* A type with known size that does not fit any of the other kinds of type. Used to represent
|
||||
* classes, structs, unions, fixed-size arrays, pointers-to-member, and more.
|
||||
*/
|
||||
class IRBlobType extends IRSizedType, TIRBlobType {
|
||||
Language::BlobTypeTag tag;
|
||||
class IROpaqueType extends IRSizedType, TIROpaqueType {
|
||||
Language::OpaqueTypeTag tag;
|
||||
|
||||
IRBlobType() {
|
||||
this = TIRBlobType(tag, byteSize)
|
||||
IROpaqueType() {
|
||||
this = TIROpaqueType(tag, byteSize)
|
||||
}
|
||||
|
||||
final override string toString() {
|
||||
result = "blob" + byteSize.toString() + "{" + tag.toString() + "}"
|
||||
result = "opaque" + byteSize.toString() + "{" + tag.toString() + "}"
|
||||
}
|
||||
|
||||
final override string getIdentityString() {
|
||||
result = "blob" + byteSize.toString() + "{" + Language::getBlobTagIdentityString(tag) + "}"
|
||||
result = "opaque" + byteSize.toString() + "{" + Language::getOpaqueTagIdentityString(tag) + "}"
|
||||
}
|
||||
|
||||
final override Language::LanguageType getCanonicalLanguageType() {
|
||||
result = Language::getCanonicalBlobType(tag, byteSize)
|
||||
result = Language::getCanonicalOpaqueType(tag, byteSize)
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the "tag" that differentiates this type from other incompatible blob types that have the
|
||||
* Gets the "tag" that differentiates this type from other incompatible opaque types that have the
|
||||
* same size.
|
||||
*/
|
||||
final Language::BlobTypeTag getTag() { result = tag }
|
||||
final Language::OpaqueTypeTag getTag() { result = tag }
|
||||
}
|
||||
|
||||
module IRTypeSanity {
|
||||
|
||||
@@ -108,17 +108,17 @@ private int getContentSize(ValueOrRefType type) {
|
||||
)
|
||||
}
|
||||
|
||||
private predicate isBlobType(ValueOrRefType type) {
|
||||
private predicate isOpaqueType(ValueOrRefType type) {
|
||||
type instanceof Struct or
|
||||
type instanceof NullableType or
|
||||
type instanceof DecimalType
|
||||
}
|
||||
|
||||
/**
|
||||
* Holds if an `IRBlobType` with the specified `tag` and `byteSize` should exist.
|
||||
* Holds if an `IROpaqueType` with the specified `tag` and `byteSize` should exist.
|
||||
*/
|
||||
predicate hasBlobType(Type tag, int byteSize) {
|
||||
isBlobType(tag) and byteSize = getTypeSize(tag)
|
||||
predicate hasOpaqueType(Type tag, int byteSize) {
|
||||
isOpaqueType(tag) and byteSize = getTypeSize(tag)
|
||||
}
|
||||
|
||||
private Type getRepresentationType(Type type) {
|
||||
@@ -135,10 +135,10 @@ private Type getRepresentationType(Type type) {
|
||||
private IRType getIRTypeForPRValue(Type type) {
|
||||
exists(Type repType |
|
||||
repType = getRepresentationType(type) |
|
||||
exists(IRBlobType blobType |
|
||||
blobType = result |
|
||||
blobType.getByteSize() = getTypeSize(repType) and
|
||||
blobType.getTag() = repType
|
||||
exists(IROpaqueType opaqueType |
|
||||
opaqueType = result |
|
||||
opaqueType.getByteSize() = getTypeSize(repType) and
|
||||
opaqueType.getTag() = repType
|
||||
)
|
||||
or
|
||||
result.(IRBooleanType).getByteSize() = repType.(BoolType).getSize()
|
||||
@@ -159,7 +159,7 @@ private IRType getIRTypeForPRValue(Type type) {
|
||||
)
|
||||
}
|
||||
|
||||
string getBlobTagIdentityString(Type tag) {
|
||||
string getOpaqueTagIdentityString(Type tag) {
|
||||
result = tag.getQualifiedName()
|
||||
}
|
||||
|
||||
@@ -412,11 +412,11 @@ CSharpPRValueType getCanonicalVoidType() {
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the `CSharpType` that is the canonical type for an `IRBlobType` with the specified `tag` and
|
||||
* Gets the `CSharpType` that is the canonical type for an `IROpaqueType` with the specified `tag` and
|
||||
* `byteSize`.
|
||||
*/
|
||||
CSharpPRValueType getCanonicalBlobType(Type tag, int byteSize) {
|
||||
isBlobType(tag) and
|
||||
CSharpPRValueType getCanonicalOpaqueType(Type tag, int byteSize) {
|
||||
isOpaqueType(tag) and
|
||||
result = TPRValueType(tag) and
|
||||
getTypeSize(tag) = byteSize
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@ private import IRUtilities
|
||||
import CSharpType
|
||||
|
||||
class LanguageType = CSharpType;
|
||||
class BlobTypeTag = CSharp::ValueOrRefType;
|
||||
class OpaqueTypeTag = CSharp::ValueOrRefType;
|
||||
|
||||
class Function = CSharp::Callable;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user