parent
693702d98d
commit
727d086dc4
|
@ -254,6 +254,7 @@ class Token:
|
||||||
isCast
|
isCast
|
||||||
externLang
|
externLang
|
||||||
isExpandedMacro Is this token a expanded macro token
|
isExpandedMacro Is this token a expanded macro token
|
||||||
|
macroName Macro name that this token is expanded from
|
||||||
isRemovedVoidParameter Has void parameter been removed?
|
isRemovedVoidParameter Has void parameter been removed?
|
||||||
isSplittedVarDeclComma Is this a comma changed to semicolon in a split variable declaration ('int a,b;' => 'int a; int b;')
|
isSplittedVarDeclComma Is this a comma changed to semicolon in a split variable declaration ('int a,b;' => 'int a; int b;')
|
||||||
isSplittedVarDeclEq Is this a '=' changed to semicolon in a split variable declaration ('int a=5;' => 'int a; a=5;')
|
isSplittedVarDeclEq Is this a '=' changed to semicolon in a split variable declaration ('int a=5;' => 'int a; a=5;')
|
||||||
|
@ -313,6 +314,7 @@ class Token:
|
||||||
isCast = False
|
isCast = False
|
||||||
isUnsigned = False
|
isUnsigned = False
|
||||||
isSigned = False
|
isSigned = False
|
||||||
|
macroName = None
|
||||||
isExpandedMacro = False
|
isExpandedMacro = False
|
||||||
isRemovedVoidParameter = False
|
isRemovedVoidParameter = False
|
||||||
isSplittedVarDeclComma = False
|
isSplittedVarDeclComma = False
|
||||||
|
@ -386,7 +388,8 @@ class Token:
|
||||||
if element.get('isCast'):
|
if element.get('isCast'):
|
||||||
self.isCast = True
|
self.isCast = True
|
||||||
self.externLang = element.get('externLang')
|
self.externLang = element.get('externLang')
|
||||||
if element.get('isExpandedMacro'):
|
self.macroName = element.get('macroName')
|
||||||
|
if self.macroName or element.get('isExpandedMacro'):
|
||||||
self.isExpandedMacro = True
|
self.isExpandedMacro = True
|
||||||
if element.get('isRemovedVoidParameter'):
|
if element.get('isRemovedVoidParameter'):
|
||||||
self.isRemovedVoidParameter = True
|
self.isRemovedVoidParameter = True
|
||||||
|
|
|
@ -2520,6 +2520,20 @@ class MisraChecker:
|
||||||
self.reportError(token, 11, 3)
|
self.reportError(token, 11, 3)
|
||||||
|
|
||||||
def misra_11_4(self, data):
|
def misra_11_4(self, data):
|
||||||
|
# Get list of macro definitions
|
||||||
|
macros = {}
|
||||||
|
for directive in data.directives:
|
||||||
|
#define X ((peripheral_t *)0x40000U)
|
||||||
|
res = re.match(r'#define ([A-Za-z0-9_]+).*', directive.str)
|
||||||
|
if res:
|
||||||
|
if res.group(1) in macros:
|
||||||
|
macros[res.group(1)].append(directive)
|
||||||
|
else:
|
||||||
|
macros[res.group(1)] = [directive]
|
||||||
|
|
||||||
|
# If macro definition is non-compliant then warn about the macro definition instead of
|
||||||
|
# the macro usages. To reduce diagnostics for a non-compliant macro.
|
||||||
|
bad_macros = []
|
||||||
for token in data.tokenlist:
|
for token in data.tokenlist:
|
||||||
if not isCast(token):
|
if not isCast(token):
|
||||||
continue
|
continue
|
||||||
|
@ -2530,6 +2544,17 @@ class MisraChecker:
|
||||||
if vt2.pointer > 0 and vt1.pointer == 0 and (vt1.isIntegral() or vt1.isEnum()) and vt2.type != 'void':
|
if vt2.pointer > 0 and vt1.pointer == 0 and (vt1.isIntegral() or vt1.isEnum()) and vt2.type != 'void':
|
||||||
self.reportError(token, 11, 4)
|
self.reportError(token, 11, 4)
|
||||||
elif vt1.pointer > 0 and vt2.pointer == 0 and (vt2.isIntegral() or vt2.isEnum()) and vt1.type != 'void':
|
elif vt1.pointer > 0 and vt2.pointer == 0 and (vt2.isIntegral() or vt2.isEnum()) and vt1.type != 'void':
|
||||||
|
if token.macroName is not None and \
|
||||||
|
token.macroName == token.astOperand1.macroName and \
|
||||||
|
token.astOperand1.isInt and \
|
||||||
|
token.link.previous.str == '*' and \
|
||||||
|
token.macroName == token.link.previous.macroName and \
|
||||||
|
token.macroName in macros and \
|
||||||
|
len(macros[token.macroName]) == 1:
|
||||||
|
if token.macroName not in bad_macros:
|
||||||
|
bad_macros.append(token.macroName)
|
||||||
|
self.reportError(macros[token.macroName][0], 11, 4)
|
||||||
|
continue
|
||||||
self.reportError(token, 11, 4)
|
self.reportError(token, 11, 4)
|
||||||
|
|
||||||
def misra_11_5(self, data):
|
def misra_11_5(self, data):
|
||||||
|
|
|
@ -798,12 +798,15 @@ static void misra_11_3(u8* p, struct Fred *fred) {
|
||||||
struct Wilma *wilma = (struct Wilma *)fred; // 11.3
|
struct Wilma *wilma = (struct Wilma *)fred; // 11.3
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct { uint32_t something; } struct_11_4;
|
||||||
|
#define A_11_4 ((struct_11_4 *)0x40000U) // 11.4
|
||||||
|
|
||||||
static void misra_11_4(u8*p) {
|
static void misra_11_4(u8*p) {
|
||||||
u64 y = (u64)p; // 11.4
|
u64 y = (u64)p; // 11.4
|
||||||
u8 *misra_11_4_A = ( u8 * ) 0x0005;// 11.4
|
u8 *misra_11_4_A = ( u8 * ) 0x0005;// 11.4
|
||||||
s32 misra_11_4_B;
|
s32 misra_11_4_B;
|
||||||
u8 *q = ( u8 * ) misra_11_4_B; // 11.4
|
u8 *q = ( u8 * ) misra_11_4_B; // 11.4
|
||||||
|
dummy = A_11_4->something; // no-warning
|
||||||
}
|
}
|
||||||
|
|
||||||
static void misra_11_5(void *p) {
|
static void misra_11_5(void *p) {
|
||||||
|
|
|
@ -5946,7 +5946,7 @@ void Tokenizer::dump(std::ostream &out) const
|
||||||
if (tok->isExternC())
|
if (tok->isExternC())
|
||||||
outs += " externLang=\"C\"";
|
outs += " externLang=\"C\"";
|
||||||
if (tok->isExpandedMacro())
|
if (tok->isExpandedMacro())
|
||||||
outs += " isExpandedMacro=\"true\"";
|
outs += " macroName=\"" + tok->getMacroName() + "\"";
|
||||||
if (tok->isTemplateArg())
|
if (tok->isTemplateArg())
|
||||||
outs += " isTemplateArg=\"true\"";
|
outs += " isTemplateArg=\"true\"";
|
||||||
if (tok->isRemovedVoidParameter())
|
if (tok->isRemovedVoidParameter())
|
||||||
|
|
Loading…
Reference in New Issue