From bc3f0364b8ee03c735f6de6e09095774c342a3de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Wed, 28 Jun 2023 15:26:21 +0200 Subject: [PATCH 1/3] Fix #11812 (Crash: misra addon, infinite recursion) --- addons/misra_9.py | 3 ++- addons/test/misra/crash3.c | 30 ++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) create mode 100644 addons/test/misra/crash3.c diff --git a/addons/misra_9.py b/addons/misra_9.py index b4f780bba27..345cf27a404 100644 --- a/addons/misra_9.py +++ b/addons/misra_9.py @@ -476,7 +476,8 @@ def createRecordChildrenDefs(ed, var): valueType = ed.valueType if not valueType or not valueType.typeScope: return - + if valueType.pointer>=1: + return for variable in valueType.typeScope.varlist: if variable is var: continue diff --git a/addons/test/misra/crash3.c b/addons/test/misra/crash3.c new file mode 100644 index 00000000000..19583f009a5 --- /dev/null +++ b/addons/test/misra/crash3.c @@ -0,0 +1,30 @@ + + + + +/* This is the representation of the expressions to determine the + plural form. */ +struct expression +{ + int nargs; /* Number of arguments. */ + union + { + unsigned long int num; /* Number value for `num'. */ + struct expression *args[3]; /* Up to three arguments. */ + } val; +}; + + +struct expression GERMANIC_PLURAL = +{ + .nargs = 2, + .val = + { + .args = + { + [0] = (struct expression *) &plvar, + [1] = (struct expression *) &plone + } + } +}; + From a9d3f519d99f699e469856fa22e887ec7233328e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Mon, 3 Jul 2023 22:25:24 +0200 Subject: [PATCH 2/3] test2 --- addons/misra_9.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/addons/misra_9.py b/addons/misra_9.py index 345cf27a404..7e0b66d0500 100644 --- a/addons/misra_9.py +++ b/addons/misra_9.py @@ -476,7 +476,9 @@ def createRecordChildrenDefs(ed, var): valueType = ed.valueType if not valueType or not valueType.typeScope: return - if valueType.pointer>=1: + if var.typeEndToken.str == '*': + child = ElementDef("pointer", var.nameToken, var.nameToken.valueType) + ed.addChild(child) return for variable in valueType.typeScope.varlist: if variable is var: From d033b1d5b77da47596edd8d3461ce737c9d2d66a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Mon, 3 Jul 2023 22:28:46 +0200 Subject: [PATCH 3/3] handle pointer children better --- addons/misra_9.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/addons/misra_9.py b/addons/misra_9.py index 7e0b66d0500..9f4c51af1ee 100644 --- a/addons/misra_9.py +++ b/addons/misra_9.py @@ -476,7 +476,10 @@ def createRecordChildrenDefs(ed, var): valueType = ed.valueType if not valueType or not valueType.typeScope: return - if var.typeEndToken.str == '*': + typeToken = var.typeEndToken + while typeToken and typeToken.isName: + typeToken = typeToken.previous + if typeToken and typeToken.str == '*': child = ElementDef("pointer", var.nameToken, var.nameToken.valueType) ed.addChild(child) return