Skip to content

Commit 9dc3f18

Browse files
committed
EssentialType: extract Add/Sub expressions
Extract out add/sub expressions special behaviour to improve clarity. This commit also simplifies the add case by avoiding referring to left/right explicitly.
1 parent 37ac088 commit 9dc3f18

File tree

1 file changed

+44
-22
lines changed

1 file changed

+44
-22
lines changed

c/misra/src/codingstandards/c/misra/EssentialTypes.qll

Lines changed: 44 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -342,28 +342,50 @@ class EssentialBinaryOperationSubjectToUsualConversions extends EssentialExpr, B
342342
then result = leftEssentialType
343343
else result = rightEssentialType
344344
)
345-
else
346-
if
347-
this instanceof AddExpr and
348-
(
349-
leftEssentialTypeCategory = EssentiallyCharacterType()
350-
or
351-
rightEssentialTypeCategory = EssentiallyCharacterType()
352-
) and
353-
(
354-
leftEssentialTypeCategory =
355-
[EssentiallySignedType(), EssentiallyUnsignedType().(TEssentialTypeCategory)]
356-
or
357-
rightEssentialTypeCategory =
358-
[EssentiallySignedType(), EssentiallyUnsignedType().(TEssentialTypeCategory)]
359-
)
360-
or
361-
this instanceof SubExpr and
362-
leftEssentialTypeCategory = EssentiallyCharacterType() and
363-
rightEssentialTypeCategory =
364-
[EssentiallySignedType(), EssentiallyUnsignedType().(TEssentialTypeCategory)]
365-
then result instanceof PlainCharType
366-
else result = this.getStandardType()
345+
else result = this.getStandardType()
346+
)
347+
}
348+
}
349+
350+
/**
351+
* An add expression, with essential type behaviour as specified by D.7.9.
352+
*/
353+
class EssentialAddExpr extends EssentialBinaryOperationSubjectToUsualConversions, AddExpr {
354+
override Type getEssentialType() {
355+
exists(
356+
EssentialTypeCategory operandTypeCategory, EssentialTypeCategory otherOperandTypeCategory
357+
|
358+
operandTypeCategory = getEssentialTypeCategory(getEssentialType(getAnOperand())) and
359+
otherOperandTypeCategory = getEssentialTypeCategory(getEssentialType(getAnOperand()))
360+
|
361+
if
362+
operandTypeCategory = EssentiallyCharacterType() and
363+
otherOperandTypeCategory =
364+
[EssentiallySignedType(), EssentiallyUnsignedType().(TEssentialTypeCategory)]
365+
then result instanceof PlainCharType
366+
else result = super.getEssentialType()
367+
)
368+
}
369+
}
370+
371+
/**
372+
* A sub expression, with essential type behaviour as specified by D.7.9.
373+
*/
374+
class EssentialSubExpr extends EssentialBinaryOperationSubjectToUsualConversions, SubExpr {
375+
override Type getEssentialType() {
376+
exists(
377+
EssentialTypeCategory leftEssentialTypeCategory,
378+
EssentialTypeCategory rightEssentialTypeCategory
379+
|
380+
leftEssentialTypeCategory = getEssentialTypeCategory(getEssentialType(getLeftOperand())) and
381+
rightEssentialTypeCategory = getEssentialTypeCategory(getEssentialType(getRightOperand()))
382+
|
383+
if
384+
leftEssentialTypeCategory = EssentiallyCharacterType() and
385+
rightEssentialTypeCategory =
386+
[EssentiallySignedType(), EssentiallyUnsignedType().(TEssentialTypeCategory)]
387+
then result instanceof PlainCharType
388+
else result = super.getEssentialType()
367389
)
368390
}
369391
}

0 commit comments

Comments
 (0)