@@ -4103,14 +4103,48 @@ 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+
41064138class TranslatedSizeofExpr extends TranslatedNonConstantExpr {
41074139 override SizeofExprOperator expr ;
41084140 VlaDeclStmt vlaDeclStmt ;
4141+ int vlaDimensions ;
41094142 int pointerDerefCount ;
41104143
41114144 TranslatedSizeofExpr ( ) {
41124145 vlaDeclStmt = getVlaDeclStmt ( expr .getExprOperand ( ) , pointerDerefCount ) and
4113- pointerDerefCount < vlaDeclStmt .getNumberOfVlaDimensionStmts ( )
4146+ vlaDimensions = getNumberOfVlaDimensions ( vlaDeclStmt ) and
4147+ pointerDerefCount < vlaDimensions
41144148 }
41154149
41164150 final override Instruction getFirstInstruction ( EdgeKind kind ) {
@@ -4119,8 +4153,7 @@ class TranslatedSizeofExpr extends TranslatedNonConstantExpr {
41194153 }
41204154
41214155 override Instruction getALastInstructionInternal ( ) {
4122- result =
4123- this .getInstruction ( SizeofVlaDimensionTag ( vlaDeclStmt .getNumberOfVlaDimensionStmts ( ) - 1 ) )
4156+ result = this .getInstruction ( SizeofVlaDimensionTag ( vlaDimensions - 1 ) )
41244157 }
41254158
41264159 final override TranslatedElement getChildInternal ( int id ) { none ( ) }
@@ -4131,9 +4164,7 @@ class TranslatedSizeofExpr extends TranslatedNonConstantExpr {
41314164 resultType = this .getResultType ( )
41324165 or
41334166 opcode instanceof Opcode:: Mul and
4134- exists ( int n | pointerDerefCount <= n and n < vlaDeclStmt .getNumberOfVlaDimensionStmts ( ) |
4135- tag = SizeofVlaDimensionTag ( n )
4136- ) and
4167+ exists ( int n | pointerDerefCount <= n and n < vlaDimensions | tag = SizeofVlaDimensionTag ( n ) ) and
41374168 resultType = this .getResultType ( )
41384169 }
41394170
@@ -4142,33 +4173,24 @@ class TranslatedSizeofExpr extends TranslatedNonConstantExpr {
41424173 result = this .getInstruction ( SizeofVlaDimensionTag ( pointerDerefCount ) ) and
41434174 kind instanceof GotoEdge
41444175 or
4145- exists ( int n | pointerDerefCount <= n and n < vlaDeclStmt . getNumberOfVlaDimensionStmts ( ) - 1 |
4176+ exists ( int n | pointerDerefCount <= n and n < vlaDimensions - 1 |
41464177 tag = SizeofVlaDimensionTag ( n ) and
41474178 result = this .getInstruction ( SizeofVlaDimensionTag ( n + 1 ) )
41484179 ) and
41494180 kind instanceof GotoEdge
41504181 or
4151- tag = SizeofVlaDimensionTag ( vlaDeclStmt . getNumberOfVlaDimensionStmts ( ) - 1 ) and
4182+ tag = SizeofVlaDimensionTag ( vlaDimensions - 1 ) and
41524183 result = this .getParent ( ) .getChildSuccessor ( this , kind )
41534184 }
41544185
41554186 override string getInstructionConstantValue ( InstructionTag tag ) {
41564187 tag = SizeofVlaDimensionTag ( - 1 ) and
41574188 result =
4158- this .getBaseSize ( vlaDeclStmt .getVariable ( ) .getType ( ) ,
4159- vlaDeclStmt .getNumberOfVlaDimensionStmts ( ) - 1 ) .toString ( )
4160- }
4161-
4162- private int getBaseSize ( DerivedType type , int n ) {
4163- n = 0 and
4164- result = type .getBaseType ( ) .getSize ( )
4165- or
4166- n = [ 1 .. vlaDeclStmt .getNumberOfVlaDimensionStmts ( ) - 1 ] and
4167- result = this .getBaseSize ( type .getBaseType ( ) , n - 1 )
4189+ getBaseType ( vlaDeclStmt .getVariable ( ) .getUnderlyingType ( ) , vlaDimensions ) .getSize ( ) .toString ( )
41684190 }
41694191
41704192 override Instruction getInstructionRegisterOperand ( InstructionTag tag , OperandTag operandTag ) {
4171- exists ( int n | pointerDerefCount <= n and n < vlaDeclStmt . getNumberOfVlaDimensionStmts ( ) |
4193+ exists ( int n | pointerDerefCount <= n and n < vlaDimensions |
41724194 tag = SizeofVlaDimensionTag ( n ) and
41734195 (
41744196 operandTag instanceof LeftOperandTag and
@@ -4182,14 +4204,20 @@ class TranslatedSizeofExpr extends TranslatedNonConstantExpr {
41824204 or
41834205 operandTag instanceof RightOperandTag and
41844206 result =
4185- getTranslatedExpr ( vlaDeclStmt . getVlaDimensionStmt ( n ) .getDimensionExpr ( ) ) .getResult ( )
4207+ getTranslatedExpr ( this . getVlaDimension ( vlaDeclStmt , n ) .getDimensionExpr ( ) ) .getResult ( )
41864208 )
41874209 )
41884210 }
41894211
4212+ private VlaDimensionStmt getVlaDimension ( VlaDeclStmt v , int n ) {
4213+ n < v .getNumberOfVlaDimensionStmts ( ) and
4214+ result = v .getVlaDimensionStmt ( n )
4215+ or
4216+ result = this .getVlaDimension ( getParentVlaDecl ( v ) , n - v .getNumberOfVlaDimensionStmts ( ) )
4217+ }
4218+
41904219 final override Instruction getResult ( ) {
4191- result =
4192- this .getInstruction ( SizeofVlaDimensionTag ( vlaDeclStmt .getNumberOfVlaDimensionStmts ( ) - 1 ) )
4220+ result = this .getInstruction ( SizeofVlaDimensionTag ( vlaDimensions - 1 ) )
41934221 }
41944222}
41954223
0 commit comments