2017-06-04 22:51:48 +02:00
#!/usr/bin/env python
2015-06-20 22:06:22 +02:00
#
# This script analyses Cppcheck dump files to locate threadsafety issues
# - warn about static local objects
#
import cppcheckdata
import sys
2015-08-21 10:55:19 +02:00
2017-08-15 21:44:21 +02:00
def reportError ( token , severity , msg , id ) :
2015-12-14 09:37:26 +01:00
sys . stderr . write (
2017-08-15 21:44:21 +02:00
' [ ' + token . file + ' : ' + str ( token . linenr ) + ' ] ( ' + severity + ' ): ' + msg + ' [ ' + id + ' ] \n ' )
2015-08-21 10:55:19 +02:00
2015-06-20 22:06:22 +02:00
def checkstatic ( data ) :
2015-08-21 10:55:19 +02:00
for var in data . variables :
2018-03-14 11:55:01 +01:00
if var . isStatic and var . isLocal :
type = None
if var . isClass :
type = ' object '
else :
type = ' variable '
if var . isConst :
2018-05-14 13:11:45 +02:00
reportError ( var . typeStartToken , ' warning ' , ' Local constant static ' + type + ' \' ' + var . nameToken . str + ' \' , dangerous if it is initialized in parallel threads ' , ' threadsafety ' )
2018-03-14 11:55:01 +01:00
else :
reportError ( var . typeStartToken , ' warning ' , ' Local static ' + type + ' : ' + var . nameToken . str , ' threadsafety ' )
2015-06-20 22:06:22 +02:00
for arg in sys . argv [ 1 : ] :
2015-08-21 10:55:19 +02:00
print ( ' Checking ' + arg + ' ... ' )
data = cppcheckdata . parsedump ( arg )
2015-12-14 09:37:26 +01:00
for cfg in data . configurations :
if len ( data . configurations ) > 1 :
print ( ' Checking ' + arg + ' , config " ' + cfg . name + ' " ... ' )
checkstatic ( cfg )