@@ -3,6 +3,10 @@ private import semmle.code.cpp.Print
33private import semmle.code.cpp.ir.implementation.IRType
44private 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) {
3539private 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 */
118122predicate 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