MCPcopy Create free account
hub / github.com/cppcheck-opensource/cppcheck / getEssentialType

Function getEssentialType

addons/misra.py:702–768  ·  view source on GitHub ↗
(expr)

Source from the content-addressed store, hash-verified

700 return None
701
702def getEssentialType(expr):
703 if not expr:
704 return None
705
706 # See Appendix D, section D.6, Character constants
707 if expr.str[0] == "'" and expr.str[-1] == "'":
708 if len(expr.str) == 3 or (len(expr.str) == 4 and expr.str[1] == '\\'):
709 return 'char'
710 return '%s %s' % (expr.valueType.sign, expr.valueType.type)
711
712 if expr.variable or isCast(expr):
713 typeToken = expr.variable.typeStartToken if expr.variable else expr.next
714 while typeToken and typeToken.isName:
715 if typeToken.str == 'char' and not typeToken.isSigned and not typeToken.isUnsigned:
716 return 'char'
717 typeToken = typeToken.next
718 if expr.valueType:
719 if expr.valueType.type == 'bool':
720 return 'bool'
721 if expr.valueType.isFloat():
722 return expr.valueType.type
723 if expr.valueType.isIntegral():
724 if (expr.valueType.sign is None) and expr.valueType.type == 'char':
725 return 'char'
726 return '%s %s' % (expr.valueType.sign, expr.valueType.type)
727
728 elif expr.isNumber:
729 # Appendix D, D.6 The essential type of literal constants
730 # Integer constants
731 if expr.valueType.type == 'bool':
732 return 'bool'
733 if expr.valueType.isFloat():
734 return expr.valueType.type
735 if expr.valueType.isIntegral():
736 if expr.valueType.type != 'int':
737 return '%s %s' % (expr.valueType.sign, expr.valueType.type)
738 return get_essential_type_from_value(expr.getKnownIntValue(), expr.valueType.sign == 'signed')
739
740 elif expr.str in ('<', '<=', '>=', '>', '==', '!=', '&&', '||', '!'):
741 return 'bool'
742
743 elif expr.astOperand1 and expr.astOperand2 and expr.str in (
744 '+', '-', '*', '/', '%', '&', '|', '^', '>>', "<<", "?", ":"):
745 if expr.astOperand1.valueType and expr.astOperand1.valueType.pointer > 0:
746 return None
747 if expr.astOperand2.valueType and expr.astOperand2.valueType.pointer > 0:
748 return None
749 e1 = getEssentialType(expr.astOperand1)
750 e2 = getEssentialType(expr.astOperand2)
751 if e1 is None or e2 is None:
752 return None
753 if is_constant_integer_expression(expr):
754 sign1 = e1.split(' ')[0]
755 sign2 = e2.split(' ')[0]
756 if sign1 == sign2 and sign1 in ('signed', 'unsigned'):
757 e = get_essential_type_from_value(expr.getKnownIntValue(), sign1 == 'signed')
758 if e:
759 return e

Callers 9

misra_10_1Method · 0.85
misra_10_2Method · 0.85
misra_10_3Method · 0.85
misra_10_6Method · 0.85
misra_10_7Method · 0.85
misra_10_8Method · 0.85
misra_12_2Method · 0.85

Calls 7

bitsOfEssentialTypeFunction · 0.85
isIntegralMethod · 0.80
getKnownIntValueMethod · 0.80
isCastFunction · 0.70
isFloatMethod · 0.45

Tested by

no test coverage detected