Skip to content

Commit 958754b

Browse files
C++: Use max to handle mixed 32/64-bit extraction
1 parent 5776077 commit 958754b

File tree

1 file changed

+12
-8
lines changed

1 file changed

+12
-8
lines changed

cpp/ql/src/semmle/code/cpp/ir/internal/CppType.qll

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@ private import semmle.code.cpp.Print
33
private import semmle.code.cpp.ir.implementation.IRType
44
private import semmle.code.cpp.ir.implementation.raw.internal.IRConstruction as IRConstruction
55

6+
private int getPointerSize() {
7+
result = max(any(NullPointerType t).getSize())
8+
}
9+
610
/**
711
* Works around an extractor bug where a function reference gets a size of one byte.
812
*/
@@ -11,22 +15,22 @@ private int getTypeSizeWorkaround(Type type) {
1115
unspecifiedType = type.getUnspecifiedType() and
1216
(
1317
unspecifiedType instanceof FunctionReferenceType and
14-
result = any(NullPointerType t).getSize()
18+
result = getPointerSize()
1519
or
1620
exists(PointerToMemberType ptmType |
1721
ptmType = unspecifiedType and
1822
(
1923
if ptmType.getBaseType().getUnspecifiedType() instanceof RoutineType
20-
then result = any(NullPointerType t).getSize() * 2
21-
else result = any(NullPointerType t).getSize()
24+
then result = getPointerSize() * 2
25+
else result = getPointerSize()
2226
)
2327
)
2428
or
2529
exists(ArrayType arrayType |
2630
// Treat `T[]` as `T*`.
2731
arrayType = unspecifiedType and
2832
not arrayType.hasArraySize() and
29-
result = any(NullPointerType t).getSize()
33+
result = getPointerSize()
3034
)
3135
)
3236
)
@@ -35,7 +39,7 @@ private int getTypeSizeWorkaround(Type type) {
3539
private int getTypeSize(Type type) {
3640
if exists(getTypeSizeWorkaround(type))
3741
then result = getTypeSizeWorkaround(type)
38-
else result = type.getSize()
42+
else result = max(type.getSize())
3943
}
4044

4145
/**
@@ -116,7 +120,7 @@ predicate hasAddressType(int byteSize) {
116120
* Holds if an `IRFunctionAddressType` with the specified `byteSize` should exist.
117121
*/
118122
predicate hasFunctionAddressType(int byteSize) {
119-
byteSize = any(NullPointerType type).getSize() or // Covers function lvalues
123+
byteSize = getPointerSize() or // Covers function lvalues
120124
byteSize = getTypeSize(any(FunctionPointerIshType type))
121125
}
122126

@@ -285,7 +289,7 @@ private class CppGLValueAddressType extends CppWrappedType, TGLValueAddressType
285289
}
286290

287291
override final IRAddressType getIRType() {
288-
result.getByteSize() = any(NullPointerType t).getSize()
292+
result.getByteSize() = getPointerSize()
289293
}
290294

291295
override final predicate hasType(Type type, boolean isGLValue) {
@@ -303,7 +307,7 @@ private class CppFunctionGLValueType extends CppType, TFunctionGLValueType {
303307
}
304308

305309
override final IRFunctionAddressType getIRType() {
306-
result.getByteSize() = any(NullPointerType type).getSize()
310+
result.getByteSize() = getPointerSize()
307311
}
308312

309313
override final predicate hasType(Type type, boolean isGLValue) {

0 commit comments

Comments
 (0)