Addons: Added simple addon checking for CERT rule EXP42-C. Don't compare struct padding data.
This commit is contained in:
parent
abbe11f3b7
commit
71eb96b8d3
|
@ -14,12 +14,37 @@ import sys
|
||||||
def reportError(token, severity, msg):
|
def reportError(token, severity, msg):
|
||||||
sys.stderr.write('[' + token.file + ':' + str(token.linenr) + '] (' + severity + ') cert.py: ' + msg + '\n')
|
sys.stderr.write('[' + token.file + ':' + str(token.linenr) + '] (' + severity + ') cert.py: ' + msg + '\n')
|
||||||
|
|
||||||
|
def isLocalStruct(arg):
|
||||||
|
if arg and arg.str == '&' and not arg.astOperand2:
|
||||||
|
arg = arg.astOperand1
|
||||||
|
return arg and arg.variable and arg.variable.isClass and (arg.variable.isLocal or arg.variable.isArgument)
|
||||||
|
|
||||||
def isBitwiseOp(token):
|
def isBitwiseOp(token):
|
||||||
return token and (token.str in ['&', '|', '^'])
|
return token and (token.str in ['&', '|', '^'])
|
||||||
|
|
||||||
def isComparisonOp(token):
|
def isComparisonOp(token):
|
||||||
return token and (token.str in ['==', '!=', '>', '>=', '<', '<='])
|
return token and (token.str in ['==', '!=', '>', '>=', '<', '<='])
|
||||||
|
|
||||||
|
|
||||||
|
# EXP42-C
|
||||||
|
# do not compare padding data
|
||||||
|
def exp42(data):
|
||||||
|
for token in data.tokenlist:
|
||||||
|
if token.str != '(' or not token.astOperand1:
|
||||||
|
continue
|
||||||
|
|
||||||
|
arg1 = None
|
||||||
|
arg2 = None
|
||||||
|
if token.astOperand2 and token.astOperand2.str == ',':
|
||||||
|
if token.astOperand2.astOperand1 and token.astOperand2.astOperand1.str == ',':
|
||||||
|
arg1 = token.astOperand2.astOperand1.astOperand1
|
||||||
|
arg2 = token.astOperand2.astOperand1.astOperand2
|
||||||
|
|
||||||
|
if token.astOperand1.str == 'memcmp' and (isLocalStruct(arg1) or isLocalStruct(arg2)):
|
||||||
|
reportError(token, 'style', 'EXP42-C Comparison of struct padding data')
|
||||||
|
if (token.astOperand1.str in ['memcpy','memmove']) and isLocalStruct(arg2):
|
||||||
|
reportError(token, 'style', 'EXP42-C Reading struct padding data')
|
||||||
|
|
||||||
# EXP46-C
|
# EXP46-C
|
||||||
# Do not use a bitwise operator with a Boolean-like operand
|
# Do not use a bitwise operator with a Boolean-like operand
|
||||||
# int x = (a == b) & c;
|
# int x = (a == b) & c;
|
||||||
|
@ -31,4 +56,5 @@ def exp46(data):
|
||||||
for arg in sys.argv[1:]:
|
for arg in sys.argv[1:]:
|
||||||
print('Checking ' + arg + '...')
|
print('Checking ' + arg + '...')
|
||||||
data = cppcheckdata.parsedump(arg)
|
data = cppcheckdata.parsedump(arg)
|
||||||
|
exp42(data)
|
||||||
exp46(data)
|
exp46(data)
|
||||||
|
|
Loading…
Reference in New Issue