From 8dbc1b802aa326f11ff4448d7a5fc6099530d0ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Tue, 17 May 2022 22:15:49 +0200 Subject: [PATCH] misra: fix crash --- .github/workflows/CI-unixish.yml | 5 +++++ addons/misra_9.py | 22 ++++++++++++---------- addons/test/misra/crash1.c | 8 ++++++++ 3 files changed, 25 insertions(+), 10 deletions(-) create mode 100644 addons/test/misra/crash1.c diff --git a/.github/workflows/CI-unixish.yml b/.github/workflows/CI-unixish.yml index 8b2e4ca19..e1099bc99 100644 --- a/.github/workflows/CI-unixish.yml +++ b/.github/workflows/CI-unixish.yml @@ -158,6 +158,11 @@ jobs: ../../cppcheck --dump -DDUMMY --suppress=uninitvar --inline-suppr misra/misra-test.c --std=c89 --platform=unix64 && python3 ../misra.py -verify misra/misra-test.c.dump ../../cppcheck --addon=misra --platform=avr8 --error-exitcode=1 misra/misra-test-avr8.c + - name: Ensure misra addon does not crash + if: contains(matrix.os, 'ubuntu') + run: | + ./cppcheck --addon=misra addons/test/misra/crash1.c | ( ! grep 'Bailing out from checking' ) + - name: Build GUI on ubuntu if: contains(matrix.os, 'ubuntu') run: | diff --git a/addons/misra_9.py b/addons/misra_9.py index 6f2863f6c..f8186db3d 100644 --- a/addons/misra_9.py +++ b/addons/misra_9.py @@ -86,7 +86,7 @@ class ElementDef: def getChildByIndex(self, index): if self.isFlexible: while len(self.children) <= index: - createChild(self, self.flexibleToken, len(self.children)) + createChild(self, self.flexibleToken, len(self.children), None) return self.children[index] if 0 <= index < len(self.children) else None def getChildByName(self, name): @@ -384,7 +384,7 @@ def misra_9_x(self, data, rule, rawTokens = None): parser = InitializerParser() for variable in data.variables: - if not variable.nameToken: + if variable.nameToken is None: continue nameToken = variable.nameToken @@ -425,15 +425,15 @@ def misra_9_x(self, data, rule, rawTokens = None): def getElementDef(nameToken, rawTokens = None): if nameToken.variable.isArray: ed = ElementDef("array", nameToken.str, nameToken.valueType) - createArrayChildrenDefs(ed, nameToken.astParent, rawTokens) + createArrayChildrenDefs(ed, nameToken.astParent, nameToken.variable, rawTokens) elif nameToken.variable.isClass: ed = ElementDef("record", nameToken.str, nameToken.valueType) - createRecordChildrenDefs(ed) + createRecordChildrenDefs(ed, nameToken.variable) else: ed = ElementDef("value", nameToken.str, nameToken.valueType) return ed -def createArrayChildrenDefs(ed, token, rawTokens = None): +def createArrayChildrenDefs(ed, token, var, rawTokens = None): if token.str == '[': if rawTokens is not None: foundToken = next((rawToken for rawToken in rawTokens @@ -447,30 +447,32 @@ def createArrayChildrenDefs(ed, token, rawTokens = None): if (token.astOperand2 is not None) and (token.astOperand2.getKnownIntValue() is not None): for i in range(token.astOperand2.getKnownIntValue()): - createChild(ed, token, i) + createChild(ed, token, i, var) else: ed.markAsFlexibleArray(token) -def createChild(ed, token, name): +def createChild(ed, token, name, var): if token.astParent and token.astParent.str == '[': child = ElementDef("array", name, ed.valueType) - createArrayChildrenDefs(child, token.astParent) + createArrayChildrenDefs(child, token.astParent, var) else: if ed.valueType and ed.valueType.type == "record": child = ElementDef("record", name, ed.valueType) - createRecordChildrenDefs(child) + createRecordChildrenDefs(child, var) else: child = ElementDef("value", name, ed.valueType) ed.addChild(child) -def createRecordChildrenDefs(ed): +def createRecordChildrenDefs(ed, var): valueType = ed.valueType if not valueType or not valueType.typeScope: return for variable in valueType.typeScope.varlist: + if variable is var: + continue child = getElementDef(variable.nameToken) ed.addChild(child) diff --git a/addons/test/misra/crash1.c b/addons/test/misra/crash1.c new file mode 100644 index 000000000..d00a72c3a --- /dev/null +++ b/addons/test/misra/crash1.c @@ -0,0 +1,8 @@ + +struct expression { + int nargs; + struct expression *args[3]; +}; + +struct expression plvar = {0}; +