@@ -4103,38 +4103,6 @@ private VlaDeclStmt getVlaDeclStmt(Expr expr, int pointerDerefCount) {
41034103 result = getVlaDeclStmt ( expr .( ArrayExpr ) .getArrayBase ( ) , pointerDerefCount - 1 )
41044104}
41054105
4106- private int getNumberOfVlaDimensions ( VlaDeclStmt vlaDeclStmt ) {
4107- not exists ( getParentVlaDecl ( vlaDeclStmt ) ) and
4108- result = vlaDeclStmt .getNumberOfVlaDimensionStmts ( )
4109- or
4110- result =
4111- vlaDeclStmt .getNumberOfVlaDimensionStmts ( ) +
4112- getNumberOfVlaDimensions ( getParentVlaDecl ( vlaDeclStmt ) )
4113- }
4114-
4115- private VlaDeclStmt getParentVlaDecl ( VlaDeclStmt vlaDeclStmt ) {
4116- exists ( Variable v , Type baseType |
4117- v = vlaDeclStmt .getVariable ( ) and
4118- baseType = getBaseType ( v .getType ( ) , vlaDeclStmt .getNumberOfVlaDimensionStmts ( ) )
4119- |
4120- result .getType ( ) = baseType
4121- )
4122- or
4123- exists ( Type t , Type baseType |
4124- t = vlaDeclStmt .getType ( ) .( TypedefType ) .getBaseType ( ) and
4125- baseType = getBaseType ( t , vlaDeclStmt .getNumberOfVlaDimensionStmts ( ) )
4126- |
4127- result .getType ( ) = baseType
4128- )
4129- }
4130-
4131- private Type getBaseType ( Type type , int n ) {
4132- n = 0 and
4133- result = type
4134- or
4135- result = getBaseType ( type .( DerivedType ) .getBaseType ( ) , n - 1 )
4136- }
4137-
41384106class TranslatedSizeofExpr extends TranslatedNonConstantExpr {
41394107 override SizeofExprOperator expr ;
41404108 VlaDeclStmt vlaDeclStmt ;
@@ -4143,12 +4111,12 @@ class TranslatedSizeofExpr extends TranslatedNonConstantExpr {
41434111
41444112 TranslatedSizeofExpr ( ) {
41454113 vlaDeclStmt = getVlaDeclStmt ( expr .getExprOperand ( ) , pointerDerefCount ) and
4146- vlaDimensions = getNumberOfVlaDimensions ( vlaDeclStmt ) and
4114+ vlaDimensions = vlaDeclStmt . getTransitiveNumberOfVlaDimensionStmts ( ) and
41474115 pointerDerefCount < vlaDimensions
41484116 }
41494117
41504118 final override Instruction getFirstInstruction ( EdgeKind kind ) {
4151- result = this .getInstruction ( SizeofVlaDimensionTag ( - 1 ) ) and
4119+ result = this .getInstruction ( SizeofVlaBaseSizeTag ( ) ) and
41524120 kind instanceof GotoEdge
41534121 }
41544122
@@ -4160,7 +4128,7 @@ class TranslatedSizeofExpr extends TranslatedNonConstantExpr {
41604128
41614129 final override predicate hasInstruction ( Opcode opcode , InstructionTag tag , CppType resultType ) {
41624130 opcode instanceof Opcode:: Constant and
4163- tag = SizeofVlaDimensionTag ( - 1 ) and
4131+ tag = SizeofVlaBaseSizeTag ( ) and
41644132 resultType = this .getResultType ( )
41654133 or
41664134 opcode instanceof Opcode:: Mul and
@@ -4169,7 +4137,7 @@ class TranslatedSizeofExpr extends TranslatedNonConstantExpr {
41694137 }
41704138
41714139 final override Instruction getInstructionSuccessorInternal ( InstructionTag tag , EdgeKind kind ) {
4172- tag = SizeofVlaDimensionTag ( - 1 ) and
4140+ tag = SizeofVlaBaseSizeTag ( ) and
41734141 result = this .getInstruction ( SizeofVlaDimensionTag ( pointerDerefCount ) ) and
41744142 kind instanceof GotoEdge
41754143 or
@@ -4184,19 +4152,27 @@ class TranslatedSizeofExpr extends TranslatedNonConstantExpr {
41844152 }
41854153
41864154 override string getInstructionConstantValue ( InstructionTag tag ) {
4187- tag = SizeofVlaDimensionTag ( - 1 ) and
4188- result = this .getVlaBaseType ( vlaDeclStmt ) .getSize ( ) .toString ( )
4155+ tag = SizeofVlaBaseSizeTag ( ) and
4156+ result = this .getBaseType ( vlaDeclStmt ) .getSize ( ) .toString ( )
41894157 }
41904158
4191- private Type getVlaBaseType ( VlaDeclStmt v ) {
4192- not exists ( getParentVlaDecl ( v ) ) and
4159+ private Type getBaseType ( VlaDeclStmt v ) {
4160+ not exists ( v . getParentVlaDecl ( ) ) and
41934161 (
4194- result = getBaseType ( v .getVariable ( ) .getUnderlyingType ( ) , v .getNumberOfVlaDimensionStmts ( ) )
4162+ result =
4163+ this .getBaseType ( v .getVariable ( ) .getUnderlyingType ( ) , v .getNumberOfVlaDimensionStmts ( ) )
41954164 or
4196- result = getBaseType ( v .getType ( ) .getUnderlyingType ( ) , v .getNumberOfVlaDimensionStmts ( ) )
4165+ result = this . getBaseType ( v .getType ( ) .getUnderlyingType ( ) , v .getNumberOfVlaDimensionStmts ( ) )
41974166 )
41984167 or
4199- result = this .getVlaBaseType ( getParentVlaDecl ( v ) )
4168+ result = this .getBaseType ( v .getParentVlaDecl ( ) )
4169+ }
4170+
4171+ private Type getBaseType ( Type type , int n ) {
4172+ n = 0 and
4173+ result = type
4174+ or
4175+ result = this .getBaseType ( type .( DerivedType ) .getBaseType ( ) , n - 1 )
42004176 }
42014177
42024178 override Instruction getInstructionRegisterOperand ( InstructionTag tag , OperandTag operandTag ) {
@@ -4209,23 +4185,17 @@ class TranslatedSizeofExpr extends TranslatedNonConstantExpr {
42094185 result = this .getInstruction ( SizeofVlaDimensionTag ( n - 1 ) )
42104186 or
42114187 n - 1 < pointerDerefCount and
4212- result = this .getInstruction ( SizeofVlaDimensionTag ( - 1 ) )
4188+ result = this .getInstruction ( SizeofVlaBaseSizeTag ( ) )
42134189 )
42144190 or
42154191 operandTag instanceof RightOperandTag and
42164192 result =
4217- getTranslatedExpr ( this .getVlaDimension ( vlaDeclStmt , n ) .getDimensionExpr ( ) ) .getResult ( )
4193+ getTranslatedExpr ( vlaDeclStmt .getTransitiveVlaDimensionStmt ( n ) .getDimensionExpr ( ) )
4194+ .getResult ( )
42184195 )
42194196 )
42204197 }
42214198
4222- private VlaDimensionStmt getVlaDimension ( VlaDeclStmt v , int n ) {
4223- n < v .getNumberOfVlaDimensionStmts ( ) and
4224- result = v .getVlaDimensionStmt ( n )
4225- or
4226- result = this .getVlaDimension ( getParentVlaDecl ( v ) , n - v .getNumberOfVlaDimensionStmts ( ) )
4227- }
4228-
42294199 final override Instruction getResult ( ) {
42304200 result = this .getInstruction ( SizeofVlaDimensionTag ( vlaDimensions - 1 ) )
42314201 }
0 commit comments