@specs-feup/clava-misra 1.0.2 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (322) hide show
  1. package/.gitignore +8 -0
  2. package/README.md +53 -19
  3. package/dist/MISRA.d.ts +28 -10
  4. package/dist/MISRA.d.ts.map +1 -1
  5. package/dist/MISRA.js +30 -10
  6. package/dist/MISRA.js.map +1 -1
  7. package/dist/MISRAContext.d.ts +65 -11
  8. package/dist/MISRAContext.d.ts.map +1 -1
  9. package/dist/MISRAContext.js +131 -35
  10. package/dist/MISRAContext.js.map +1 -1
  11. package/dist/MISRARule.d.ts +38 -25
  12. package/dist/MISRARule.d.ts.map +1 -1
  13. package/dist/MISRARule.js +40 -18
  14. package/dist/MISRARule.js.map +1 -1
  15. package/dist/MISRATool.d.ts +39 -5
  16. package/dist/MISRATool.d.ts.map +1 -1
  17. package/dist/MISRATool.js +102 -46
  18. package/dist/MISRATool.js.map +1 -1
  19. package/dist/StandardGuideline.d.ts +22 -0
  20. package/dist/StandardGuideline.d.ts.map +1 -0
  21. package/dist/StandardGuideline.js +12 -0
  22. package/dist/StandardGuideline.js.map +1 -0
  23. package/dist/ast-visitor/Context.d.ts +11 -0
  24. package/dist/ast-visitor/Context.d.ts.map +1 -0
  25. package/dist/ast-visitor/Context.js +15 -0
  26. package/dist/ast-visitor/Context.js.map +1 -0
  27. package/dist/ast-visitor/Visit.d.ts +23 -0
  28. package/dist/ast-visitor/Visit.d.ts.map +1 -0
  29. package/dist/ast-visitor/Visit.js +18 -0
  30. package/dist/ast-visitor/Visit.js.map +1 -0
  31. package/dist/ast-visitor/VisitWithContext.d.ts +32 -0
  32. package/dist/ast-visitor/VisitWithContext.d.ts.map +1 -0
  33. package/dist/ast-visitor/VisitWithContext.js +26 -0
  34. package/dist/ast-visitor/VisitWithContext.js.map +1 -0
  35. package/dist/main.js +1 -1
  36. package/dist/main.js.map +1 -1
  37. package/dist/rules/Section13_SideEffects/Rule_13_6_SafeSizeOfOperand.d.ts +27 -0
  38. package/dist/rules/Section13_SideEffects/Rule_13_6_SafeSizeOfOperand.d.ts.map +1 -0
  39. package/dist/rules/Section13_SideEffects/Rule_13_6_SafeSizeOfOperand.js +98 -0
  40. package/dist/rules/Section13_SideEffects/Rule_13_6_SafeSizeOfOperand.js.map +1 -0
  41. package/dist/rules/Section16_SwitchStatements/Rule_16_2_TopLevelSwitch.d.ts +45 -6
  42. package/dist/rules/Section16_SwitchStatements/Rule_16_2_TopLevelSwitch.d.ts.map +1 -1
  43. package/dist/rules/Section16_SwitchStatements/Rule_16_2_TopLevelSwitch.js +91 -8
  44. package/dist/rules/Section16_SwitchStatements/Rule_16_2_TopLevelSwitch.js.map +1 -1
  45. package/dist/rules/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.d.ts +15 -5
  46. package/dist/rules/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.d.ts.map +1 -1
  47. package/dist/rules/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.js +20 -6
  48. package/dist/rules/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.js.map +1 -1
  49. package/dist/rules/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.d.ts +11 -5
  50. package/dist/rules/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.d.ts.map +1 -1
  51. package/dist/rules/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.js +13 -10
  52. package/dist/rules/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.js.map +1 -1
  53. package/dist/rules/Section16_SwitchStatements/Rule_16_5_DefaultFirstOrLast.d.ts +11 -6
  54. package/dist/rules/Section16_SwitchStatements/Rule_16_5_DefaultFirstOrLast.d.ts.map +1 -1
  55. package/dist/rules/Section16_SwitchStatements/Rule_16_5_DefaultFirstOrLast.js +19 -11
  56. package/dist/rules/Section16_SwitchStatements/Rule_16_5_DefaultFirstOrLast.js.map +1 -1
  57. package/dist/rules/Section16_SwitchStatements/Rule_16_6_SwitchMinTwoClauses.d.ts +15 -5
  58. package/dist/rules/Section16_SwitchStatements/Rule_16_6_SwitchMinTwoClauses.d.ts.map +1 -1
  59. package/dist/rules/Section16_SwitchStatements/Rule_16_6_SwitchMinTwoClauses.js +24 -10
  60. package/dist/rules/Section16_SwitchStatements/Rule_16_6_SwitchMinTwoClauses.js.map +1 -1
  61. package/dist/rules/Section16_SwitchStatements/Rule_16_7_NonBooleanSwitchCondition.d.ts +22 -6
  62. package/dist/rules/Section16_SwitchStatements/Rule_16_7_NonBooleanSwitchCondition.d.ts.map +1 -1
  63. package/dist/rules/Section16_SwitchStatements/Rule_16_7_NonBooleanSwitchCondition.js +37 -10
  64. package/dist/rules/Section16_SwitchStatements/Rule_16_7_NonBooleanSwitchCondition.js.map +1 -1
  65. package/dist/rules/Section17_Functions/Rule_17_3_ImplicitFunction.d.ts +66 -0
  66. package/dist/rules/Section17_Functions/Rule_17_3_ImplicitFunction.d.ts.map +1 -0
  67. package/dist/rules/Section17_Functions/Rule_17_3_ImplicitFunction.js +209 -0
  68. package/dist/rules/Section17_Functions/Rule_17_3_ImplicitFunction.js.map +1 -0
  69. package/dist/rules/Section17_Functions/Rule_17_4_NonVoidReturn.d.ts +37 -12
  70. package/dist/rules/Section17_Functions/Rule_17_4_NonVoidReturn.d.ts.map +1 -1
  71. package/dist/rules/Section17_Functions/Rule_17_4_NonVoidReturn.js +112 -39
  72. package/dist/rules/Section17_Functions/Rule_17_4_NonVoidReturn.js.map +1 -1
  73. package/dist/rules/Section17_Functions/Rule_17_6_StaticArraySizeParam.d.ts +15 -5
  74. package/dist/rules/Section17_Functions/Rule_17_6_StaticArraySizeParam.d.ts.map +1 -1
  75. package/dist/rules/Section17_Functions/Rule_17_6_StaticArraySizeParam.js +21 -7
  76. package/dist/rules/Section17_Functions/Rule_17_6_StaticArraySizeParam.js.map +1 -1
  77. package/dist/rules/Section17_Functions/Rule_17_7_UnusedReturnValue.d.ts +11 -6
  78. package/dist/rules/Section17_Functions/Rule_17_7_UnusedReturnValue.d.ts.map +1 -1
  79. package/dist/rules/Section17_Functions/Rule_17_7_UnusedReturnValue.js +17 -8
  80. package/dist/rules/Section17_Functions/Rule_17_7_UnusedReturnValue.js.map +1 -1
  81. package/dist/rules/Section21-StandardLibraries/DisallowedStdLibFunctionRule.d.ts +105 -0
  82. package/dist/rules/Section21-StandardLibraries/DisallowedStdLibFunctionRule.d.ts.map +1 -0
  83. package/dist/rules/Section21-StandardLibraries/DisallowedStdLibFunctionRule.js +258 -0
  84. package/dist/rules/Section21-StandardLibraries/DisallowedStdLibFunctionRule.js.map +1 -0
  85. package/dist/rules/Section21-StandardLibraries/Rule_21_10_NoTimeDateFunctions.d.ts +25 -0
  86. package/dist/rules/Section21-StandardLibraries/Rule_21_10_NoTimeDateFunctions.d.ts.map +1 -0
  87. package/dist/rules/Section21-StandardLibraries/Rule_21_10_NoTimeDateFunctions.js +27 -0
  88. package/dist/rules/Section21-StandardLibraries/Rule_21_10_NoTimeDateFunctions.js.map +1 -0
  89. package/dist/rules/Section21-StandardLibraries/Rule_21_11_NoTgmathFunctions.d.ts +29 -0
  90. package/dist/rules/Section21-StandardLibraries/Rule_21_11_NoTgmathFunctions.d.ts.map +1 -0
  91. package/dist/rules/Section21-StandardLibraries/Rule_21_11_NoTgmathFunctions.js +31 -0
  92. package/dist/rules/Section21-StandardLibraries/Rule_21_11_NoTgmathFunctions.js.map +1 -0
  93. package/dist/rules/Section21-StandardLibraries/Rule_21_3_NoDynamicMemory.d.ts +25 -0
  94. package/dist/rules/Section21-StandardLibraries/Rule_21_3_NoDynamicMemory.d.ts.map +1 -0
  95. package/dist/rules/Section21-StandardLibraries/Rule_21_3_NoDynamicMemory.js +27 -0
  96. package/dist/rules/Section21-StandardLibraries/Rule_21_3_NoDynamicMemory.js.map +1 -0
  97. package/dist/rules/Section21-StandardLibraries/Rule_21_6_NoStdIOFunctions.d.ts +25 -0
  98. package/dist/rules/Section21-StandardLibraries/Rule_21_6_NoStdIOFunctions.d.ts.map +1 -0
  99. package/dist/rules/Section21-StandardLibraries/Rule_21_6_NoStdIOFunctions.js +27 -0
  100. package/dist/rules/Section21-StandardLibraries/Rule_21_6_NoStdIOFunctions.js.map +1 -0
  101. package/dist/rules/Section21-StandardLibraries/Rule_21_7_NoNumericStringConversions.d.ts +25 -0
  102. package/dist/rules/Section21-StandardLibraries/Rule_21_7_NoNumericStringConversions.d.ts.map +1 -0
  103. package/dist/rules/Section21-StandardLibraries/Rule_21_7_NoNumericStringConversions.js +27 -0
  104. package/dist/rules/Section21-StandardLibraries/Rule_21_7_NoNumericStringConversions.js.map +1 -0
  105. package/dist/rules/Section21-StandardLibraries/Rule_21_8_NoProcessControlFunctions.d.ts +30 -0
  106. package/dist/rules/Section21-StandardLibraries/Rule_21_8_NoProcessControlFunctions.d.ts.map +1 -0
  107. package/dist/rules/Section21-StandardLibraries/Rule_21_8_NoProcessControlFunctions.js +32 -0
  108. package/dist/rules/Section21-StandardLibraries/Rule_21_8_NoProcessControlFunctions.js.map +1 -0
  109. package/dist/rules/Section21-StandardLibraries/Rule_21_9_NoGenericSearchOrSort.d.ts +25 -0
  110. package/dist/rules/Section21-StandardLibraries/Rule_21_9_NoGenericSearchOrSort.d.ts.map +1 -0
  111. package/dist/rules/Section21-StandardLibraries/Rule_21_9_NoGenericSearchOrSort.js +27 -0
  112. package/dist/rules/Section21-StandardLibraries/Rule_21_9_NoGenericSearchOrSort.js.map +1 -0
  113. package/dist/rules/Section2_UnusedCode/Rule_2_3_UnusedTypeDecl.d.ts +6 -14
  114. package/dist/rules/Section2_UnusedCode/Rule_2_3_UnusedTypeDecl.d.ts.map +1 -1
  115. package/dist/rules/Section2_UnusedCode/Rule_2_3_UnusedTypeDecl.js +17 -27
  116. package/dist/rules/Section2_UnusedCode/Rule_2_3_UnusedTypeDecl.js.map +1 -1
  117. package/dist/rules/Section2_UnusedCode/Rule_2_4_UnusedTagDecl.d.ts +13 -7
  118. package/dist/rules/Section2_UnusedCode/Rule_2_4_UnusedTagDecl.d.ts.map +1 -1
  119. package/dist/rules/Section2_UnusedCode/Rule_2_4_UnusedTagDecl.js +31 -17
  120. package/dist/rules/Section2_UnusedCode/Rule_2_4_UnusedTagDecl.js.map +1 -1
  121. package/dist/rules/Section2_UnusedCode/Rule_2_6_UnusedLabels.d.ts +26 -7
  122. package/dist/rules/Section2_UnusedCode/Rule_2_6_UnusedLabels.d.ts.map +1 -1
  123. package/dist/rules/Section2_UnusedCode/Rule_2_6_UnusedLabels.js +32 -14
  124. package/dist/rules/Section2_UnusedCode/Rule_2_6_UnusedLabels.js.map +1 -1
  125. package/dist/rules/Section2_UnusedCode/Rule_2_7_UnusedParameters.d.ts +48 -6
  126. package/dist/rules/Section2_UnusedCode/Rule_2_7_UnusedParameters.d.ts.map +1 -1
  127. package/dist/rules/Section2_UnusedCode/Rule_2_7_UnusedParameters.js +84 -34
  128. package/dist/rules/Section2_UnusedCode/Rule_2_7_UnusedParameters.js.map +1 -1
  129. package/dist/rules/Section3_Comments/Rule_3_1_CommentSequences.d.ts +24 -5
  130. package/dist/rules/Section3_Comments/Rule_3_1_CommentSequences.d.ts.map +1 -1
  131. package/dist/rules/Section3_Comments/Rule_3_1_CommentSequences.js +27 -7
  132. package/dist/rules/Section3_Comments/Rule_3_1_CommentSequences.js.map +1 -1
  133. package/dist/rules/Section5_Identifiers/IdentifierRenameRule.d.ts +46 -0
  134. package/dist/rules/Section5_Identifiers/IdentifierRenameRule.d.ts.map +1 -0
  135. package/dist/rules/Section5_Identifiers/IdentifierRenameRule.js +40 -0
  136. package/dist/rules/Section5_Identifiers/IdentifierRenameRule.js.map +1 -0
  137. package/dist/rules/Section5_Identifiers/Rule_5_1_DistinctExternalIdentifiers.d.ts +25 -0
  138. package/dist/rules/Section5_Identifiers/Rule_5_1_DistinctExternalIdentifiers.d.ts.map +1 -0
  139. package/dist/rules/Section5_Identifiers/Rule_5_1_DistinctExternalIdentifiers.js +46 -0
  140. package/dist/rules/Section5_Identifiers/Rule_5_1_DistinctExternalIdentifiers.js.map +1 -0
  141. package/dist/rules/Section5_Identifiers/Rule_5_6_UniqueTypedefNames.d.ts +26 -0
  142. package/dist/rules/Section5_Identifiers/Rule_5_6_UniqueTypedefNames.d.ts.map +1 -0
  143. package/dist/rules/Section5_Identifiers/Rule_5_6_UniqueTypedefNames.js +54 -0
  144. package/dist/rules/Section5_Identifiers/Rule_5_6_UniqueTypedefNames.js.map +1 -0
  145. package/dist/rules/Section5_Identifiers/Rule_5_7_UniqueTagNames.d.ts +27 -0
  146. package/dist/rules/Section5_Identifiers/Rule_5_7_UniqueTagNames.d.ts.map +1 -0
  147. package/dist/rules/Section5_Identifiers/Rule_5_7_UniqueTagNames.js +55 -0
  148. package/dist/rules/Section5_Identifiers/Rule_5_7_UniqueTagNames.js.map +1 -0
  149. package/dist/rules/Section5_Identifiers/Rule_5_8_UniqueExternalLinkIdentifiers.d.ts +24 -0
  150. package/dist/rules/Section5_Identifiers/Rule_5_8_UniqueExternalLinkIdentifiers.d.ts.map +1 -0
  151. package/dist/rules/Section5_Identifiers/Rule_5_8_UniqueExternalLinkIdentifiers.js +42 -0
  152. package/dist/rules/Section5_Identifiers/Rule_5_8_UniqueExternalLinkIdentifiers.js.map +1 -0
  153. package/dist/rules/Section5_Identifiers/Rule_5_9_UniqueInternalLinkIdentifiers.d.ts +24 -0
  154. package/dist/rules/Section5_Identifiers/Rule_5_9_UniqueInternalLinkIdentifiers.d.ts.map +1 -0
  155. package/dist/rules/Section5_Identifiers/Rule_5_9_UniqueInternalLinkIdentifiers.js +42 -0
  156. package/dist/rules/Section5_Identifiers/Rule_5_9_UniqueInternalLinkIdentifiers.js.map +1 -0
  157. package/dist/rules/Section8_DeclarationsAndDefinitions/Rule_8_6_SingleExternalDefinition.d.ts +35 -0
  158. package/dist/rules/Section8_DeclarationsAndDefinitions/Rule_8_6_SingleExternalDefinition.d.ts.map +1 -0
  159. package/dist/rules/Section8_DeclarationsAndDefinitions/Rule_8_6_SingleExternalDefinition.js +98 -0
  160. package/dist/rules/Section8_DeclarationsAndDefinitions/Rule_8_6_SingleExternalDefinition.js.map +1 -0
  161. package/dist/rules/Section8_DeclarationsAndDefinitions/Rule_8_7_RestrictExternalLinkage.d.ts +35 -0
  162. package/dist/rules/Section8_DeclarationsAndDefinitions/Rule_8_7_RestrictExternalLinkage.d.ts.map +1 -0
  163. package/dist/rules/Section8_DeclarationsAndDefinitions/Rule_8_7_RestrictExternalLinkage.js +76 -0
  164. package/dist/rules/Section8_DeclarationsAndDefinitions/Rule_8_7_RestrictExternalLinkage.js.map +1 -0
  165. package/dist/rules/Section8_DeclarationsAndDefinitions/Rule_8_9_BlockScopeDefinition.d.ts +32 -0
  166. package/dist/rules/Section8_DeclarationsAndDefinitions/Rule_8_9_BlockScopeDefinition.d.ts.map +1 -0
  167. package/dist/rules/Section8_DeclarationsAndDefinitions/Rule_8_9_BlockScopeDefinition.js +57 -0
  168. package/dist/rules/Section8_DeclarationsAndDefinitions/Rule_8_9_BlockScopeDefinition.js.map +1 -0
  169. package/dist/rules/UserConfigurableRule.d.ts +55 -0
  170. package/dist/rules/UserConfigurableRule.d.ts.map +1 -0
  171. package/dist/rules/UserConfigurableRule.js +16 -0
  172. package/dist/rules/UserConfigurableRule.js.map +1 -0
  173. package/dist/rules/index.d.ts +11 -18
  174. package/dist/rules/index.d.ts.map +1 -1
  175. package/dist/rules/index.js +47 -7
  176. package/dist/rules/index.js.map +1 -1
  177. package/dist/tests/Section17_Functions/misra_config.json +10 -0
  178. package/dist/tests/Section21-StandardLibraries/misra_config.json +88 -0
  179. package/dist/tests/Section21-StandardLibraries/problematic_misra_config.json +19 -0
  180. package/dist/tests/utils.d.ts +6 -3
  181. package/dist/tests/utils.d.ts.map +1 -1
  182. package/dist/tests/utils.js +33 -7
  183. package/dist/tests/utils.js.map +1 -1
  184. package/dist/utils/CallUtils.d.ts +15 -0
  185. package/dist/utils/CallUtils.d.ts.map +1 -0
  186. package/dist/utils/CallUtils.js +34 -0
  187. package/dist/utils/CallUtils.js.map +1 -0
  188. package/dist/utils/CommentUtils.d.ts +21 -0
  189. package/dist/utils/CommentUtils.d.ts.map +1 -0
  190. package/dist/utils/CommentUtils.js +27 -0
  191. package/dist/utils/CommentUtils.js.map +1 -0
  192. package/dist/utils/FileUtils.d.ts +51 -0
  193. package/dist/utils/FileUtils.d.ts.map +1 -0
  194. package/dist/utils/FileUtils.js +121 -0
  195. package/dist/utils/FileUtils.js.map +1 -0
  196. package/dist/utils/FunctionUtils.d.ts +25 -0
  197. package/dist/utils/FunctionUtils.d.ts.map +1 -0
  198. package/dist/utils/FunctionUtils.js +65 -0
  199. package/dist/utils/FunctionUtils.js.map +1 -0
  200. package/dist/utils/IdentifierUtils.d.ts +14 -0
  201. package/dist/utils/IdentifierUtils.d.ts.map +1 -0
  202. package/dist/utils/IdentifierUtils.js +87 -0
  203. package/dist/utils/IdentifierUtils.js.map +1 -0
  204. package/dist/utils/JoinpointUtils.d.ts +19 -0
  205. package/dist/utils/JoinpointUtils.d.ts.map +1 -0
  206. package/dist/utils/JoinpointUtils.js +46 -0
  207. package/dist/utils/JoinpointUtils.js.map +1 -0
  208. package/dist/utils/ProgramUtils.d.ts +14 -0
  209. package/dist/utils/ProgramUtils.d.ts.map +1 -0
  210. package/dist/utils/ProgramUtils.js +72 -0
  211. package/dist/utils/ProgramUtils.js.map +1 -0
  212. package/dist/utils/SwitchUtils.d.ts +21 -0
  213. package/dist/utils/SwitchUtils.d.ts.map +1 -0
  214. package/dist/utils/SwitchUtils.js +47 -0
  215. package/dist/utils/SwitchUtils.js.map +1 -0
  216. package/dist/utils/TypeDeclUtils.d.ts +35 -0
  217. package/dist/utils/TypeDeclUtils.d.ts.map +1 -0
  218. package/dist/utils/TypeDeclUtils.js +78 -0
  219. package/dist/utils/TypeDeclUtils.js.map +1 -0
  220. package/dist/utils/VarUtils.d.ts +19 -0
  221. package/dist/utils/VarUtils.d.ts.map +1 -0
  222. package/dist/utils/VarUtils.js +59 -0
  223. package/dist/utils/VarUtils.js.map +1 -0
  224. package/package.json +16 -6
  225. package/src/MISRA.ts +33 -17
  226. package/src/MISRAContext.ts +128 -30
  227. package/src/MISRARule.ts +61 -29
  228. package/src/MISRATool.ts +108 -42
  229. package/src/StandardGuideline.ts +23 -0
  230. package/src/ast-visitor/Context.ts +16 -0
  231. package/src/ast-visitor/Visit.ts +26 -0
  232. package/src/ast-visitor/VisitWithContext.ts +42 -0
  233. package/src/main.ts +1 -1
  234. package/src/rules/Section13_SideEffects/Rule_13_6_SafeSizeOfOperand.ts +114 -0
  235. package/src/rules/Section16_SwitchStatements/Rule_16_2_TopLevelSwitch.ts +103 -13
  236. package/src/rules/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.ts +24 -10
  237. package/src/rules/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.ts +17 -8
  238. package/src/rules/Section16_SwitchStatements/Rule_16_5_DefaultFirstOrLast.ts +20 -12
  239. package/src/rules/Section16_SwitchStatements/Rule_16_6_SwitchMinTwoClauses.ts +23 -12
  240. package/src/rules/Section16_SwitchStatements/Rule_16_7_NonBooleanSwitchCondition.ts +44 -13
  241. package/src/rules/Section17_Functions/Rule_17_3_ImplicitFunction.ts +153 -104
  242. package/src/rules/Section17_Functions/Rule_17_4_NonVoidReturn.ts +114 -44
  243. package/src/rules/Section17_Functions/Rule_17_6_StaticArraySizeParam.ts +27 -10
  244. package/src/rules/Section17_Functions/Rule_17_7_UnusedReturnValue.ts +20 -12
  245. package/src/rules/Section21-StandardLibraries/DisallowedStdLibFunctionRule.ts +317 -0
  246. package/src/rules/Section21-StandardLibraries/Rule_21_10_NoTimeDateFunctions.ts +30 -0
  247. package/src/rules/Section21-StandardLibraries/Rule_21_11_NoTgmathFunctions.ts +35 -0
  248. package/src/rules/Section21-StandardLibraries/Rule_21_3_NoDynamicMemory.ts +30 -0
  249. package/src/rules/Section21-StandardLibraries/Rule_21_6_NoStdIOFunctions.ts +30 -0
  250. package/src/rules/Section21-StandardLibraries/Rule_21_7_NoNumericStringConversions.ts +29 -0
  251. package/src/rules/Section21-StandardLibraries/Rule_21_8_NoProcessControlFunctions.ts +36 -0
  252. package/src/rules/Section21-StandardLibraries/Rule_21_9_NoGenericSearchOrSort.ts +30 -0
  253. package/src/rules/Section2_UnusedCode/Rule_2_3_UnusedTypeDecl.ts +14 -29
  254. package/src/rules/Section2_UnusedCode/Rule_2_4_UnusedTagDecl.ts +33 -19
  255. package/src/rules/Section2_UnusedCode/Rule_2_6_UnusedLabels.ts +33 -20
  256. package/src/rules/Section2_UnusedCode/Rule_2_7_UnusedParameters.ts +90 -45
  257. package/src/rules/Section3_Comments/Rule_3_1_CommentSequences.ts +27 -8
  258. package/src/rules/Section5_Identifiers/IdentifierRenameRule.ts +63 -0
  259. package/src/rules/Section5_Identifiers/Rule_5_1_DistinctExternalIdentifiers.ts +52 -0
  260. package/src/rules/Section5_Identifiers/Rule_5_6_UniqueTypedefNames.ts +62 -0
  261. package/src/rules/Section5_Identifiers/Rule_5_7_UniqueTagNames.ts +61 -0
  262. package/src/rules/Section5_Identifiers/Rule_5_8_UniqueExternalLinkIdentifiers.ts +47 -0
  263. package/src/rules/Section5_Identifiers/Rule_5_9_UniqueInternalLinkIdentifiers.ts +47 -0
  264. package/src/rules/Section8_DeclarationsAndDefinitions/Rule_8_6_SingleExternalDefinition.ts +118 -0
  265. package/src/rules/Section8_DeclarationsAndDefinitions/Rule_8_7_RestrictExternalLinkage.ts +89 -0
  266. package/src/rules/Section8_DeclarationsAndDefinitions/Rule_8_9_BlockScopeDefinition.ts +65 -0
  267. package/src/rules/UserConfigurableRule.ts +60 -0
  268. package/src/rules/index.ts +45 -7
  269. package/src/tests/Section13_SideEffects/Rule_13_6_SafeSizeOfOperand.test.ts +114 -0
  270. package/src/tests/Section16_SwitchStatements/Rule_16_2_TopLevelSwitch.test.ts +7 -5
  271. package/src/tests/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.test.ts +40 -13
  272. package/src/tests/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.test.ts +10 -12
  273. package/src/tests/Section16_SwitchStatements/Rule_16_5_DefaultFirstOrLast.test.ts +5 -5
  274. package/src/tests/Section16_SwitchStatements/Rule_16_6_SwitchMinTwoClauses.test.ts +5 -5
  275. package/src/tests/Section16_SwitchStatements/Rule_16_7_NonBooleanSwitchCondition.test.ts +5 -5
  276. package/src/tests/Section17_Functions/Rule_17_3_ImplicitFunctions.test.ts +68 -40
  277. package/src/tests/Section17_Functions/Rule_17_3_ImplicitFunctions_MissingConfig.test.ts +98 -0
  278. package/src/tests/Section17_Functions/Rule_17_3_ImplicitFunctions_ProblematicConfig.test.ts +71 -0
  279. package/src/tests/Section17_Functions/Rule_17_4_NonVoidReturn.test.ts +103 -49
  280. package/src/tests/Section17_Functions/Rule_17_4_NonVoidReturn_MissingConfig.test.ts +7 -7
  281. package/src/tests/Section17_Functions/Rule_17_6_StaticArraySizeParam.test.ts +36 -7
  282. package/src/tests/Section17_Functions/Rule_17_7_UnusedReturnValue.test.ts +25 -21
  283. package/src/tests/Section17_Functions/misra_config.json +4 -3
  284. package/src/tests/Section21-StandardLibraries/Rule_21_10_NoTimeDateFunctions.test.ts +62 -0
  285. package/src/tests/Section21-StandardLibraries/Rule_21_11_NoTgmathFunctions.test.ts +67 -0
  286. package/src/tests/Section21-StandardLibraries/Rule_21_3_NoDynamicMemory.test.ts +84 -0
  287. package/src/tests/Section21-StandardLibraries/Rule_21_3_NoDynamicMemory_MissingConfig.test.ts +33 -0
  288. package/src/tests/Section21-StandardLibraries/Rule_21_3_NoDynamicMemory_ProblematicConfig.test.ts +71 -0
  289. package/src/tests/Section21-StandardLibraries/Rule_21_6_NoStdIOFunctions.test.ts +63 -0
  290. package/src/tests/Section21-StandardLibraries/Rule_21_7_NoNumericStringConversions.test.ts +91 -0
  291. package/src/tests/Section21-StandardLibraries/Rule_21_8_NoProcessControlFunctions.test.ts +65 -0
  292. package/src/tests/Section21-StandardLibraries/Rule_21_9_NoGenericSearchOrSort.test.ts +89 -0
  293. package/src/tests/Section21-StandardLibraries/misra_config.json +88 -0
  294. package/src/tests/Section21-StandardLibraries/problematic_misra_config.json +19 -0
  295. package/src/tests/Section2_UnusedCode/Rule_2_3_UnusedTypeDecl.test.ts +148 -113
  296. package/src/tests/Section2_UnusedCode/Rule_2_4_UnusedTagDecl.test.ts +243 -163
  297. package/src/tests/Section2_UnusedCode/Rule_2_6_UnusedLabels.test.ts +32 -20
  298. package/src/tests/Section2_UnusedCode/Rule_2_7_UnusedParameters.test.ts +36 -30
  299. package/src/tests/Section3_Comments/Rule_3_1_CommentSequences.test.ts +37 -8
  300. package/src/tests/Section5_Identifiers/Rule_5_1_DistinctExternalIdentifiers.test.ts +78 -0
  301. package/src/tests/Section5_Identifiers/Rule_5_6_UniqueTypedefNames.test.ts +120 -0
  302. package/src/tests/Section5_Identifiers/Rule_5_7_UniqueTagNames.test.ts +51 -0
  303. package/src/tests/Section5_Identifiers/Rule_5_8_UniqueExternalLinkIdentifiers.test.ts +73 -0
  304. package/src/tests/Section5_Identifiers/Rule_5_9_UniqueInternalLinkIdentifiers.test.ts +97 -0
  305. package/src/tests/Section8_DeclarationsAndDefinitions/Rule_8_6_SingleExternalDefinition.test.ts +160 -0
  306. package/src/tests/Section8_DeclarationsAndDefinitions/Rule_8_7_RestrictExternalLinkage.test.ts +46 -0
  307. package/src/tests/Section8_DeclarationsAndDefinitions/Rule_8_9_BlockScopeDefinition.test.ts +69 -0
  308. package/src/tests/utils.ts +32 -7
  309. package/src/utils/CallUtils.ts +40 -0
  310. package/src/utils/CommentUtils.ts +29 -0
  311. package/src/utils/FileUtils.ts +141 -0
  312. package/src/utils/FunctionUtils.ts +75 -0
  313. package/src/utils/IdentifierUtils.ts +94 -0
  314. package/src/utils/JoinpointUtils.ts +53 -0
  315. package/src/utils/ProgramUtils.ts +83 -0
  316. package/src/utils/SwitchUtils.ts +52 -0
  317. package/src/utils/TypeDeclUtils.ts +89 -0
  318. package/src/utils/VarUtils.ts +70 -0
  319. package/tsconfig.json +2 -1
  320. package/src/rules/Section20-PreprocessingDirectives/Rule_20_2_InvalidHeaderFileName.ts +0 -120
  321. package/src/rules/Section3_Comments/Rule_3_2_LineSplicing.ts +0 -36
  322. package/src/utils/utils.ts +0 -280
@@ -0,0 +1,32 @@
1
+ import { LaraJoinPoint } from "@specs-feup/lara/api/LaraJoinPoint.js";
2
+ import Context from "./Context.js";
3
+ import Visit from "./Visit.js";
4
+ /**
5
+ * Visit with a shared context to enable communication between visits
6
+ *
7
+ * Need to implement:
8
+ * - apply($jp)
9
+ * - initialValue()
10
+ */
11
+ export default abstract class VisitWithContext<T, C extends Context<T> = Context<T>> extends Visit {
12
+ protected context: C;
13
+ /**
14
+ * @param context Shared context object
15
+ */
16
+ constructor(context: C);
17
+ /**
18
+ * @return Visit name, defaults to class name
19
+ */
20
+ get name(): string;
21
+ /**
22
+ * @returns Initial value stored in the shared context
23
+ */
24
+ abstract initialValue(): T;
25
+ /**
26
+ * Applies the transformation to the given node
27
+ * @param $jp The node to transform
28
+ * @returns Transformation result
29
+ */
30
+ abstract apply($jp: LaraJoinPoint): unknown;
31
+ }
32
+ //# sourceMappingURL=VisitWithContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VisitWithContext.d.ts","sourceRoot":"","sources":["../../src/ast-visitor/VisitWithContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AACtE,OAAO,OAAO,MAAM,cAAc,CAAC;AACnC,OAAO,KAAK,MAAM,YAAY,CAAC;AAE/B;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,CAAC,QAAQ,OAAO,gBAAgB,CAAC,CAAC,EAAE,CAAC,SAAS,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAE,SAAQ,KAAK;IAC9F,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;IAErB;;OAEG;gBACS,OAAO,EAAE,CAAC;IAMtB;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;OAEG;IACH,QAAQ,CAAC,YAAY,IAAI,CAAC;IAE1B;;;;OAIG;IACH,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO;CAC9C"}
@@ -0,0 +1,26 @@
1
+ import Visit from "./Visit.js";
2
+ /**
3
+ * Visit with a shared context to enable communication between visits
4
+ *
5
+ * Need to implement:
6
+ * - apply($jp)
7
+ * - initialValue()
8
+ */
9
+ export default class VisitWithContext extends Visit {
10
+ context;
11
+ /**
12
+ * @param context Shared context object
13
+ */
14
+ constructor(context) {
15
+ super();
16
+ this.context = context;
17
+ this.context.put(this.name, this.initialValue());
18
+ }
19
+ /**
20
+ * @return Visit name, defaults to class name
21
+ */
22
+ get name() {
23
+ return this.constructor.name;
24
+ }
25
+ }
26
+ //# sourceMappingURL=VisitWithContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VisitWithContext.js","sourceRoot":"","sources":["../../src/ast-visitor/VisitWithContext.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,YAAY,CAAC;AAE/B;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,OAAgB,gBAAuD,SAAQ,KAAK;IACpF,OAAO,CAAI;IAErB;;OAEG;IACH,YAAY,OAAU;QAClB,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;IACrD,CAAC;IAED;;OAEG;IACH,IAAI,IAAI;QACJ,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;IACjC,CAAC;CAaJ"}
package/dist/main.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import MISRATool from "./MISRATool.js";
2
2
  MISRATool.checkCompliance();
3
- MISRATool.applyCorrections();
3
+ MISRATool.correctViolations();
4
4
  //await VisualizationTool.visualize();
5
5
  //# sourceMappingURL=main.js.map
package/dist/main.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AACA,OAAO,SAAS,MAAM,gBAAgB,CAAC;AAEvC,SAAS,CAAC,eAAe,EAAE,CAAC;AAC5B,SAAS,CAAC,gBAAgB,EAAE,CAAC;AAE7B,sCAAsC"}
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AACA,OAAO,SAAS,MAAM,gBAAgB,CAAC;AAEvC,SAAS,CAAC,eAAe,EAAE,CAAC;AAC5B,SAAS,CAAC,iBAAiB,EAAE,CAAC;AAE9B,sCAAsC"}
@@ -0,0 +1,27 @@
1
+ import { Joinpoint } from "@specs-feup/clava/api/Joinpoints.js";
2
+ import MISRARule from "../../MISRARule.js";
3
+ import { AnalysisType, MISRATransformationReport } from "../../MISRA.js";
4
+ /**
5
+ * MISRA-C Rule 13.6: The operand of the sizeof operator shall not contain any expression which has potential side effects
6
+ */
7
+ export default class Rule_13_6_SafeSizeOfOperand extends MISRARule {
8
+ #private;
9
+ /**
10
+ * Scope of analysis
11
+ */
12
+ analysisType: AnalysisType;
13
+ /**
14
+ * @returns Rule identifier according to MISRA-C:2012
15
+ */
16
+ get name(): string;
17
+ private operandIsVariableArrayType;
18
+ /**
19
+ *
20
+ * @param $jp - Joinpoint to analyze
21
+ * @param logErrors - [logErrors=false] - Whether to log errors if a violation is detected
22
+ * @returns Returns true if the joinpoint violates the rule, false otherwise
23
+ */
24
+ match($jp: Joinpoint, logErrors?: boolean): boolean;
25
+ apply($jp: Joinpoint): MISRATransformationReport;
26
+ }
27
+ //# sourceMappingURL=Rule_13_6_SafeSizeOfOperand.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Rule_13_6_SafeSizeOfOperand.d.ts","sourceRoot":"","sources":["../../../src/rules/Section13_SideEffects/Rule_13_6_SafeSizeOfOperand.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0B,SAAS,EAAkE,MAAM,qCAAqC,CAAC;AACxJ,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,yBAAyB,EAA2B,MAAM,gBAAgB,CAAC;AAMlG;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,2BAA4B,SAAQ,SAAS;;IAC9D;;OAEG;IACH,YAAY,eAAwC;IAMpD;;OAEG;IACH,IAAa,IAAI,IAAI,MAAM,CAE1B;IAED,OAAO,CAAC,0BAA0B;IAIlC;;;;;OAKG;IACH,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,GAAE,OAAe,GAAG,OAAO;IA+B1D,KAAK,CAAC,GAAG,EAAE,SAAS,GAAG,yBAAyB;CA4CnD"}
@@ -0,0 +1,98 @@
1
+ import { BinaryOp, Call, UnaryExprOrType, UnaryOp, VariableArrayType, Varref } from "@specs-feup/clava/api/Joinpoints.js";
2
+ import MISRARule from "../../MISRARule.js";
3
+ import { AnalysisType, MISRATransformationReport, MISRATransformationType } from "../../MISRA.js";
4
+ import Query from "@specs-feup/lara/api/weaver/Query.js";
5
+ import { getVolatileVarRefs } from "../../utils/VarUtils.js";
6
+ import { isValidFile } from "../../utils/FileUtils.js";
7
+ import ClavaJoinPoints from "@specs-feup/clava/api/clava/ClavaJoinPoints.js";
8
+ /**
9
+ * MISRA-C Rule 13.6: The operand of the sizeof operator shall not contain any expression which has potential side effects
10
+ */
11
+ export default class Rule_13_6_SafeSizeOfOperand extends MISRARule {
12
+ /**
13
+ * Scope of analysis
14
+ */
15
+ analysisType = AnalysisType.SINGLE_TRANSLATION_UNIT;
16
+ #modifyingExpressions = [];
17
+ #functionCalls = [];
18
+ #volatileRefs = [];
19
+ /**
20
+ * @returns Rule identifier according to MISRA-C:2012
21
+ */
22
+ get name() {
23
+ return "13.6";
24
+ }
25
+ operandIsVariableArrayType($jp) {
26
+ return $jp.argType != undefined && $jp.argType instanceof VariableArrayType;
27
+ }
28
+ /**
29
+ *
30
+ * @param $jp - Joinpoint to analyze
31
+ * @param logErrors - [logErrors=false] - Whether to log errors if a violation is detected
32
+ * @returns Returns true if the joinpoint violates the rule, false otherwise
33
+ */
34
+ match($jp, logErrors = false) {
35
+ if (!($jp instanceof UnaryExprOrType && $jp.kind === "sizeof")) {
36
+ return false;
37
+ }
38
+ this.#functionCalls = Query.searchFromInclusive($jp, Call).get();
39
+ this.#volatileRefs = this.operandIsVariableArrayType($jp) ? getVolatileVarRefs($jp.argType.sizeExpr) : [];
40
+ this.#modifyingExpressions = [
41
+ ...Query.searchFromInclusive($jp, UnaryOp, { kind: /(post_inc)|(post_dec)|(pre_inc)|(pre_dec)/ }).get(),
42
+ ...Query.searchFromInclusive($jp, BinaryOp, { kind: /(assign)|(add_assign)|(sub_assign)|(mul_assign)|(div_assign)|(rem_assign)|(shl_assign)|(shr_assign)|(and_assign)|(xor_assign)|(or_assign)/ }).get()
43
+ ];
44
+ const isNonCompliant = this.#functionCalls.length > 0 || this.#modifyingExpressions.length > 0 || this.#volatileRefs.length > 0;
45
+ if (isNonCompliant && logErrors) {
46
+ this.#functionCalls.forEach(call => {
47
+ this.logMISRAError(call, `Function call '${call.name}' in sizeof is not allowed because it has no effect.`);
48
+ });
49
+ this.#modifyingExpressions.forEach(expr => {
50
+ this.logMISRAError(expr, `Modifying expression '${expr.code}' in sizeof is not allowed because it has no effect.`);
51
+ });
52
+ this.#volatileRefs.forEach(ref => {
53
+ this.logMISRAError(ref, `Access to volatile object ${ref.name} in sizeof is not allowed.`);
54
+ });
55
+ }
56
+ return isNonCompliant;
57
+ }
58
+ apply($jp) {
59
+ if (!this.match($jp)) {
60
+ return new MISRATransformationReport(MISRATransformationType.NoChange);
61
+ }
62
+ if (!this.operandIsVariableArrayType($jp)) {
63
+ for (const callJp of this.#functionCalls) {
64
+ const callAncestor = callJp.getAncestor("call");
65
+ if (callAncestor === undefined || callAncestor.depth < $jp.depth) {
66
+ const functionType = callJp.functionType.returnType;
67
+ const fileJp = callJp.getAncestor("file");
68
+ const tempJp = fileJp.lastChild.insertAfter(ClavaJoinPoints.stmtLiteral(`static int _temp_misra_var = sizeof(${functionType.code});`));
69
+ const jpIndex = Query.searchFrom(fileJp, UnaryExprOrType).get().length;
70
+ let newSizeOf = isValidFile(fileJp, UnaryExprOrType, jpIndex);
71
+ newSizeOf = $jp.replaceWith(newSizeOf);
72
+ newSizeOf.setArgType(functionType);
73
+ tempJp.detach();
74
+ return new MISRATransformationReport(MISRATransformationType.Replacement, newSizeOf);
75
+ }
76
+ }
77
+ for (const expr of this.#modifyingExpressions) {
78
+ let varRef = expr instanceof BinaryOp ?
79
+ expr.left : Query.searchFrom(expr, Varref).get()[0];
80
+ expr.replaceWith(varRef);
81
+ }
82
+ return new MISRATransformationReport(MISRATransformationType.DescendantChange);
83
+ }
84
+ else {
85
+ this.#functionCalls.forEach(call => {
86
+ this.logMISRAError(call, `Function call '${call.name}' in sizeof is not allowed. Could not correct because it is used to define a variable-length array type and it is unspecified whether it will be evaluated or not.`);
87
+ });
88
+ this.#modifyingExpressions.forEach(expr => {
89
+ this.logMISRAError(expr, `Modifying expression '${expr.code}' in sizeof is not allowed. Could not correct because it is used to define a variable-length array type and it is unspecified whether it will be evaluated or not.`);
90
+ });
91
+ this.#volatileRefs.forEach(ref => {
92
+ this.logMISRAError(ref, `Access to volatile object '${ref.name}' in sizeof is not allowed. Could not correct because it is used to define a variable-length array type and it is unspecified whether it will be evaluated or not.`);
93
+ });
94
+ return new MISRATransformationReport(MISRATransformationType.NoChange);
95
+ }
96
+ }
97
+ }
98
+ //# sourceMappingURL=Rule_13_6_SafeSizeOfOperand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Rule_13_6_SafeSizeOfOperand.js","sourceRoot":"","sources":["../../../src/rules/Section13_SideEffects/Rule_13_6_SafeSizeOfOperand.ts"],"names":[],"mappings":"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"}
@@ -1,15 +1,54 @@
1
1
  import { Joinpoint } from "@specs-feup/clava/api/Joinpoints.js";
2
2
  import MISRARule from "../../MISRARule.js";
3
- import MISRAContext from "../../MISRAContext.js";
4
- import { MISRATransformationReport } from "../../MISRA.js";
3
+ import { AnalysisType, MISRATransformationReport } from "../../MISRA.js";
5
4
  /**
6
- * MISRA Rule 16.2: A switch label shall only be used when the most closely-enclos ing
7
- compound statement is the body of a switch statement
5
+ * MISRA-C Rule 16.2: A switch label shall only be used when the most closely-enclosing compound statement is the body of a switch statement
8
6
  */
9
7
  export default class Rule_16_2_TopLevelSwitch extends MISRARule {
10
8
  #private;
11
- constructor(context: MISRAContext);
9
+ /**
10
+ * Scope of analysis
11
+ */
12
+ readonly analysisType = AnalysisType.SINGLE_TRANSLATION_UNIT;
13
+ /**
14
+ * A positive integer starting from 1 that indicates the rule's priority, determining the order in which rules are applied.
15
+ */
16
+ readonly priority = 4;
17
+ /**
18
+ * @returns Rule identifier according to MISRA-C:2012
19
+ */
20
+ get name(): string;
21
+ /**
22
+ * Checks if the given joinpoint is a switch statement with any misplaced case labels.
23
+ * A case label is considered misplaced if it is not a direct child of the switch body.
24
+ *
25
+ * @param $jp - Joinpoint to analyze
26
+ * @param logErrors - [logErrors=false] - Whether to log errors if a violation is detected
27
+ * @returns Returns true if the joinpoint violates the rule, false otherwise
28
+ */
12
29
  match($jp: Joinpoint, logErrors?: boolean): boolean;
13
- transform($jp: Joinpoint): MISRATransformationReport;
30
+ /**
31
+ * Transforms the joinpoint if it represents a switch with any misplaced case labels.
32
+ * For that, each case label is moved to a new location within the switch.
33
+ *
34
+ * @param $jp - Joinpoint to transform
35
+ * @returns Report detailing the transformation result
36
+ */
37
+ apply($jp: Joinpoint): MISRATransformationReport;
38
+ /**
39
+ * Relocates a inner case to a new position while preserving control flow.
40
+ * First, copies the instructions to be executed (direct siblings and fall-through code).
41
+ * Then, moves the case to the new position and finally appends the copied instructions after the case.
42
+ *
43
+ * @param caseLabel The inner case to relocate
44
+ */
45
+ private changeCaseLocation;
46
+ /**
47
+ * Retrieves the top-level case that contains a given inner case label.
48
+ *
49
+ * @param caseLabel - The inner case joinpoint
50
+ * @returns The ancestor case that contains the given inner case
51
+ */
52
+ private getCaseAncestor;
14
53
  }
15
54
  //# sourceMappingURL=Rule_16_2_TopLevelSwitch.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Rule_16_2_TopLevelSwitch.d.ts","sourceRoot":"","sources":["../../../src/rules/Section16_SwitchStatements/Rule_16_2_TopLevelSwitch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,SAAS,EAAU,MAAM,qCAAqC,CAAC;AAC9E,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,YAAY,MAAM,uBAAuB,CAAC;AAEjD,OAAO,EAAE,yBAAyB,EAA2B,MAAM,gBAAgB,CAAC;AAEpF;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,wBAAyB,SAAQ,SAAS;;gBAG/C,OAAO,EAAE,YAAY;IAIjC,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,GAAE,OAAe,GAAG,OAAO;IAc1D,SAAS,CAAC,GAAG,EAAE,SAAS,GAAG,yBAAyB;CAQvD"}
1
+ {"version":3,"file":"Rule_16_2_TopLevelSwitch.d.ts","sourceRoot":"","sources":["../../../src/rules/Section16_SwitchStatements/Rule_16_2_TopLevelSwitch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,SAAS,EAAU,MAAM,qCAAqC,CAAC;AACrF,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EAAE,YAAY,EAAE,yBAAyB,EAA2B,MAAM,gBAAgB,CAAC;AAElG;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,wBAAyB,SAAQ,SAAS;;IAC3D;;OAEG;IACH,QAAQ,CAAC,YAAY,wCAAwC;IAE7D;;OAEG;IACH,QAAQ,CAAC,QAAQ,KAAK;IAItB;;OAEG;IACH,IAAa,IAAI,IAAI,MAAM,CAE1B;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,GAAE,OAAe,GAAG,OAAO;IAc1D;;;;;;OAMG;IACH,KAAK,CAAC,GAAG,EAAE,SAAS,GAAG,yBAAyB;IAWhD;;;;;;OAMG;IACH,OAAO,CAAC,kBAAkB;IAyC1B;;;;;OAKG;IACH,OAAO,CAAC,eAAe;CAQ1B"}
@@ -1,16 +1,34 @@
1
- import { Case, Switch } from "@specs-feup/clava/api/Joinpoints.js";
1
+ import { Break, Case, Switch } from "@specs-feup/clava/api/Joinpoints.js";
2
2
  import MISRARule from "../../MISRARule.js";
3
3
  import Query from "@specs-feup/lara/api/weaver/Query.js";
4
- import { MISRATransformationReport, MISRATransformationType } from "../../MISRA.js";
4
+ import { AnalysisType, MISRATransformationReport, MISRATransformationType } from "../../MISRA.js";
5
5
  /**
6
- * MISRA Rule 16.2: A switch label shall only be used when the most closely-enclos ing
7
- compound statement is the body of a switch statement
6
+ * MISRA-C Rule 16.2: A switch label shall only be used when the most closely-enclosing compound statement is the body of a switch statement
8
7
  */
9
8
  export default class Rule_16_2_TopLevelSwitch extends MISRARule {
9
+ /**
10
+ * Scope of analysis
11
+ */
12
+ analysisType = AnalysisType.SINGLE_TRANSLATION_UNIT;
13
+ /**
14
+ * A positive integer starting from 1 that indicates the rule's priority, determining the order in which rules are applied.
15
+ */
16
+ priority = 4;
10
17
  #misplacedCases = [];
11
- constructor(context) {
12
- super("16.2", context);
18
+ /**
19
+ * @returns Rule identifier according to MISRA-C:2012
20
+ */
21
+ get name() {
22
+ return "16.2";
13
23
  }
24
+ /**
25
+ * Checks if the given joinpoint is a switch statement with any misplaced case labels.
26
+ * A case label is considered misplaced if it is not a direct child of the switch body.
27
+ *
28
+ * @param $jp - Joinpoint to analyze
29
+ * @param logErrors - [logErrors=false] - Whether to log errors if a violation is detected
30
+ * @returns Returns true if the joinpoint violates the rule, false otherwise
31
+ */
14
32
  match($jp, logErrors = false) {
15
33
  if (!($jp instanceof Switch))
16
34
  return false;
@@ -21,13 +39,78 @@ export default class Rule_16_2_TopLevelSwitch extends MISRARule {
21
39
  }
22
40
  return this.#misplacedCases.length > 0;
23
41
  }
24
- transform($jp) {
42
+ /**
43
+ * Transforms the joinpoint if it represents a switch with any misplaced case labels.
44
+ * For that, each case label is moved to a new location within the switch.
45
+ *
46
+ * @param $jp - Joinpoint to transform
47
+ * @returns Report detailing the transformation result
48
+ */
49
+ apply($jp) {
25
50
  if (!this.match($jp))
26
51
  return new MISRATransformationReport(MISRATransformationType.NoChange);
27
52
  for (const caseLabel of this.#misplacedCases) {
28
- caseLabel.detach();
53
+ this.changeCaseLocation(caseLabel);
29
54
  }
30
55
  return new MISRATransformationReport(MISRATransformationType.DescendantChange);
31
56
  }
57
+ /**
58
+ * Relocates a inner case to a new position while preserving control flow.
59
+ * First, copies the instructions to be executed (direct siblings and fall-through code).
60
+ * Then, moves the case to the new position and finally appends the copied instructions after the case.
61
+ *
62
+ * @param caseLabel The inner case to relocate
63
+ */
64
+ changeCaseLocation(caseLabel) {
65
+ // Collect instructions that follow the given case
66
+ const instructions = caseLabel.siblingsRight.map(sibling => sibling.deepCopy());
67
+ // If direct instruction do not have a break statement, find additional statements from higher scopes that will be executed
68
+ if (!instructions.some(instruction => instruction instanceof Break)) {
69
+ let lastScope = caseLabel;
70
+ do {
71
+ lastScope = lastScope.parent;
72
+ const rightStmts = lastScope.siblingsRight;
73
+ for (const rightStmt of rightStmts) {
74
+ if (rightStmt.currentRegion instanceof Switch && rightStmt instanceof Case) {
75
+ break;
76
+ }
77
+ instructions.push(rightStmt.deepCopy());
78
+ }
79
+ } while (!(lastScope.currentRegion instanceof Switch));
80
+ }
81
+ // Locate target position
82
+ const caseAncestor = this.getCaseAncestor(caseLabel);
83
+ const caseAncestorRightSiblings = caseAncestor.siblingsRight;
84
+ const nextCaseIndex = caseAncestorRightSiblings.findIndex(jp => jp instanceof Case);
85
+ const targetStmt = nextCaseIndex != -1 ? caseAncestorRightSiblings[nextCaseIndex] : caseAncestorRightSiblings[caseAncestorRightSiblings.length - 1];
86
+ // Move case label to the new position
87
+ caseLabel.detach();
88
+ if (targetStmt instanceof Case) {
89
+ targetStmt.insertBefore(caseLabel);
90
+ }
91
+ else {
92
+ targetStmt.insertAfter(caseLabel);
93
+ }
94
+ // Add instructions after caseLabel
95
+ let lastStmt = caseLabel;
96
+ for (const instruction of instructions) {
97
+ lastStmt.insertAfter(instruction);
98
+ lastStmt = instruction;
99
+ }
100
+ }
101
+ /**
102
+ * Retrieves the top-level case that contains a given inner case label.
103
+ *
104
+ * @param caseLabel - The inner case joinpoint
105
+ * @returns The ancestor case that contains the given inner case
106
+ */
107
+ getCaseAncestor(caseLabel) {
108
+ let stmt = caseLabel;
109
+ while (!(stmt.currentRegion instanceof Switch)) {
110
+ stmt = stmt.parent;
111
+ }
112
+ const caseAncestor = stmt.siblingsLeft.reverse().find(jp => jp instanceof Case);
113
+ return caseAncestor;
114
+ }
32
115
  }
33
116
  //# sourceMappingURL=Rule_16_2_TopLevelSwitch.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Rule_16_2_TopLevelSwitch.js","sourceRoot":"","sources":["../../../src/rules/Section16_SwitchStatements/Rule_16_2_TopLevelSwitch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAa,MAAM,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAE3C,OAAO,KAAK,MAAM,sCAAsC,CAAC;AACzD,OAAO,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAEpF;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,wBAAyB,SAAQ,SAAS;IAC3D,eAAe,GAAW,EAAE,CAAC;IAE7B,YAAY,OAAqB;QAC7B,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,GAAc,EAAE,YAAqB,KAAK;QAC5C,IAAI,CAAC,CAAC,GAAG,YAAY,MAAM,CAAC;YAAE,OAAO,KAAK,CAAC;QAE3C,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE;aACnD,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,YAAY,MAAM,CAAC,CAAC,CAAC;QAEvE,IAAI,SAAS,EAAE,CAAC;YACZ,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CACrC,IAAI,CAAC,aAAa,CAAC,SAAS,EAAE,qGAAqG,CAAC,CACvI,CAAC;QACN,CAAC;QACD,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC;IAC3C,CAAC;IAED,SAAS,CAAC,GAAc;QACpB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,yBAAyB,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;QAE7F,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YAC3C,SAAS,CAAC,MAAM,EAAE,CAAC;QACvB,CAAC;QACD,OAAO,IAAI,yBAAyB,CAAC,uBAAuB,CAAC,gBAAgB,CAAC,CAAC;IACnF,CAAC;CACJ"}
1
+ {"version":3,"file":"Rule_16_2_TopLevelSwitch.js","sourceRoot":"","sources":["../../../src/rules/Section16_SwitchStatements/Rule_16_2_TopLevelSwitch.ts"],"names":[],"mappings":"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"}
@@ -1,16 +1,26 @@
1
1
  import { Joinpoint } from "@specs-feup/clava/api/Joinpoints.js";
2
2
  import MISRARule from "../../MISRARule.js";
3
- import MISRAContext from "../../MISRAContext.js";
4
- import { MISRATransformationReport } from "../../MISRA.js";
3
+ import { AnalysisType, MISRATransformationReport } from "../../MISRA.js";
5
4
  /**
6
- * MISRA Rule 16.3: An unconditional break statement shall terminate every switch-clause
5
+ * MISRA-C Rule 16.3: An unconditional break statement shall terminate every switch-clause
7
6
  */
8
7
  export default class Rule_16_3_UnconditionalBreak extends MISRARule {
9
8
  #private;
10
- constructor(context: MISRAContext);
9
+ /**
10
+ * Scope of analysis
11
+ */
12
+ readonly analysisType = AnalysisType.SINGLE_TRANSLATION_UNIT;
13
+ /**
14
+ * A positive integer starting from 1 that indicates the rule's priority, determining the order in which rules are applied.
15
+ */
16
+ readonly priority = 3;
17
+ /**
18
+ * @returns Rule identifier according to MISRA-C:2012
19
+ */
20
+ get name(): string;
11
21
  match($jp: Joinpoint, logErrors?: boolean): boolean;
12
22
  private getNextStatementsToExecute;
13
23
  private insertNextStatementsToExecute;
14
- transform($jp: Joinpoint): MISRATransformationReport;
24
+ apply($jp: Joinpoint): MISRATransformationReport;
15
25
  }
16
26
  //# sourceMappingURL=Rule_16_3_UnconditionalBreak.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Rule_16_3_UnconditionalBreak.d.ts","sourceRoot":"","sources":["../../../src/rules/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,SAAS,EAA2B,MAAM,qCAAqC,CAAC;AAChG,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,YAAY,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,yBAAyB,EAA2B,MAAM,gBAAgB,CAAC;AAIpF;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,4BAA6B,SAAQ,SAAS;;gBAGnD,OAAO,EAAE,YAAY;IAIjC,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,GAAE,OAAe,GAAG,OAAO;IAc1D,OAAO,CAAC,0BAA0B;IAalC,OAAO,CAAC,6BAA6B;IAWrC,SAAS,CAAC,GAAG,EAAE,SAAS,GAAG,yBAAyB;CAavD"}
1
+ {"version":3,"file":"Rule_16_3_UnconditionalBreak.d.ts","sourceRoot":"","sources":["../../../src/rules/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,SAAS,EAAgB,MAAM,qCAAqC,CAAC;AACrF,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,yBAAyB,EAA2B,MAAM,gBAAgB,CAAC;AAIlG;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,4BAA6B,SAAQ,SAAS;;IAC/D;;OAEG;IACH,QAAQ,CAAC,YAAY,wCAAwC;IAE7D;;OAEG;IACH,QAAQ,CAAC,QAAQ,KAAK;IAOtB;;OAEG;IACH,IAAa,IAAI,IAAI,MAAM,CAE1B;IAED,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,GAAE,OAAe,GAAG,OAAO;IAc1D,OAAO,CAAC,0BAA0B;IAalC,OAAO,CAAC,6BAA6B;IAWrC,KAAK,CAAC,GAAG,EAAE,SAAS,GAAG,yBAAyB;CAanD"}
@@ -1,15 +1,29 @@
1
1
  import { Break, Switch, Case } from "@specs-feup/clava/api/Joinpoints.js";
2
2
  import MISRARule from "../../MISRARule.js";
3
- import { MISRATransformationReport, MISRATransformationType } from "../../MISRA.js";
4
- import { getLastStmtOfCase } from "../../utils/utils.js";
3
+ import { AnalysisType, MISRATransformationReport, MISRATransformationType } from "../../MISRA.js";
5
4
  import ClavaJoinPoints from "@specs-feup/clava/api/clava/ClavaJoinPoints.js";
5
+ import { getLastStmtOfCase } from "../../utils/SwitchUtils.js";
6
6
  /**
7
- * MISRA Rule 16.3: An unconditional break statement shall terminate every switch-clause
7
+ * MISRA-C Rule 16.3: An unconditional break statement shall terminate every switch-clause
8
8
  */
9
9
  export default class Rule_16_3_UnconditionalBreak extends MISRARule {
10
+ /**
11
+ * Scope of analysis
12
+ */
13
+ analysisType = AnalysisType.SINGLE_TRANSLATION_UNIT;
14
+ /**
15
+ * A positive integer starting from 1 that indicates the rule's priority, determining the order in which rules are applied.
16
+ */
17
+ priority = 3;
18
+ /**
19
+ * List of statements that require a `break` statement as their last sibling
20
+ */
10
21
  #statementsNeedingBreakAfter = [];
11
- constructor(context) {
12
- super("16.3", context);
22
+ /**
23
+ * @returns Rule identifier according to MISRA-C:2012
24
+ */
25
+ get name() {
26
+ return "16.3";
13
27
  }
14
28
  match($jp, logErrors = false) {
15
29
  if (!($jp instanceof Switch))
@@ -43,7 +57,7 @@ export default class Rule_16_3_UnconditionalBreak extends MISRARule {
43
57
  }
44
58
  lastStmt.insertAfter(ClavaJoinPoints.breakStmt());
45
59
  }
46
- transform($jp) {
60
+ apply($jp) {
47
61
  if (!this.match($jp))
48
62
  return new MISRATransformationReport(MISRATransformationType.NoChange);
49
63
  for (const stmt of this.#statementsNeedingBreakAfter) {
@@ -1 +1 @@
1
- {"version":3,"file":"Rule_16_3_UnconditionalBreak.js","sourceRoot":"","sources":["../../../src/rules/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAwB,MAAM,EAAE,IAAI,EAAE,MAAM,qCAAqC,CAAC;AAChG,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACpF,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,eAAe,MAAM,gDAAgD,CAAC;AAE7E;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,4BAA6B,SAAQ,SAAS;IAC/D,4BAA4B,GAAgB,EAAE,CAAC;IAE/C,YAAY,OAAqB;QAC7B,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,GAAc,EAAE,YAAqB,KAAK;QAC5C,IAAI,CAAC,CAAC,GAAG,YAAY,MAAM,CAAC;YAAE,OAAO,KAAK,CAAC;QAE3C,IAAI,CAAC,4BAA4B,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;aACvF,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,YAAY,KAAK,CAAC,CAAgB,CAAC;QAEjF,IAAI,SAAS,EAAE,CAAC;YACZ,IAAI,CAAC,4BAA4B,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBAC7C,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,gDAAgD,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC;YAC3F,CAAC,CAAC,CAAC;QACP,CAAC;QACD,OAAO,IAAI,CAAC,4BAA4B,CAAC,MAAM,GAAG,CAAC,CAAC;IACxD,CAAC;IAEO,0BAA0B,CAAC,EAAa;QAC5C,IAAI,KAAK,GAAG,EAAE,CAAC;QAEf,KAAK,MAAM,OAAO,IAAI,EAAE,CAAC,aAAa,EAAE,CAAC;YACrC,IAAI,OAAO,YAAY,KAAK;gBACxB,MAAM;YACV,IAAI,OAAO,YAAY,IAAI;gBACvB,SAAS;YACb,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QACnC,CAAC;QACD,OAAO,KAAK,CAAC;IACjB,CAAC;IAEO,6BAA6B,CAAC,EAAa;QAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,0BAA0B,CAAC,EAAE,CAAC,CAAC;QACtD,IAAI,QAAQ,GAAG,EAAE,CAAC;QAElB,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;YAC3B,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YAC3B,QAAQ,GAAG,IAAI,CAAC;QACpB,CAAC;QACD,QAAQ,CAAC,WAAW,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,SAAS,CAAC,GAAc;QACpB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;YAChB,OAAO,IAAI,yBAAyB,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;QAE3E,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,4BAA4B,EAAE,CAAC;YACnD,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC,CAAC,+BAA+B;gBAC7D,IAAI,CAAC,WAAW,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC,CAAC;YAClD,CAAC;iBAAM,CAAC;gBACJ,IAAI,CAAC,6BAA6B,CAAC,IAAI,CAAC,CAAC;YAC7C,CAAC;QACL,CAAC;QACD,OAAO,IAAI,yBAAyB,CAAC,uBAAuB,CAAC,gBAAgB,CAAC,CAAC;IACnF,CAAC;CACJ"}
1
+ {"version":3,"file":"Rule_16_3_UnconditionalBreak.js","sourceRoot":"","sources":["../../../src/rules/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,18 @@
1
1
  import { Joinpoint } from "@specs-feup/clava/api/Joinpoints.js";
2
2
  import MISRARule from "../../MISRARule.js";
3
- import MISRAContext from "../../MISRAContext.js";
4
- import { MISRATransformationReport } from "../../MISRA.js";
3
+ import { AnalysisType, MISRATransformationReport } from "../../MISRA.js";
5
4
  /**
6
- * MISRA Rule 16.4: Every switch statement shall have a default label
5
+ * MISRA-C Rule 16.4: Every switch statement shall have a default label
7
6
  */
8
7
  export default class Rule_16_4_SwitchHasDefault extends MISRARule {
9
- constructor(context: MISRAContext);
8
+ /**
9
+ * Scope of analysis
10
+ */
11
+ readonly analysisType = AnalysisType.SINGLE_TRANSLATION_UNIT;
12
+ /**
13
+ * @returns Rule identifier according to MISRA-C:2012
14
+ */
15
+ get name(): string;
10
16
  /**
11
17
  * Checks if the given joinpoint is a switch statement with a default case
12
18
  * @param $jp - Joinpoint to analyze
@@ -14,6 +20,6 @@ export default class Rule_16_4_SwitchHasDefault extends MISRARule {
14
20
  * @returns Returns true if the joinpoint violates the rule, false otherwise
15
21
  */
16
22
  match($jp: Joinpoint, logErrors?: boolean): boolean;
17
- transform($jp: Joinpoint): MISRATransformationReport;
23
+ apply($jp: Joinpoint): MISRATransformationReport;
18
24
  }
19
25
  //# sourceMappingURL=Rule_16_4_SwitchHasDefault.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Rule_16_4_SwitchHasDefault.d.ts","sourceRoot":"","sources":["../../../src/rules/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAU,MAAM,qCAAqC,CAAC;AACxE,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,YAAY,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,yBAAyB,EAA2B,MAAM,gBAAgB,CAAC;AAIpF;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,0BAA2B,SAAQ,SAAS;gBACjD,OAAO,EAAE,YAAY;IAIjC;;;;;OAKG;IACH,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,GAAE,OAAe,GAAG,OAAO;IAU1D,SAAS,CAAC,GAAG,EAAE,SAAS,GAAG,yBAAyB;CAcvD"}
1
+ {"version":3,"file":"Rule_16_4_SwitchHasDefault.d.ts","sourceRoot":"","sources":["../../../src/rules/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAU,MAAM,qCAAqC,CAAC;AACxE,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,yBAAyB,EAA2B,MAAM,gBAAgB,CAAC;AAGlG;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,0BAA2B,SAAQ,SAAS;IAC7D;;OAEG;IACH,QAAQ,CAAC,YAAY,wCAAwC;IAE5D;;MAEE;IACH,IAAa,IAAI,IAAI,MAAM,CAE1B;IAED;;;;;OAKG;IACH,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,GAAE,OAAe,GAAG,OAAO;IAU1D,KAAK,CAAC,GAAG,EAAE,SAAS,GAAG,yBAAyB;CAYnD"}
@@ -1,14 +1,20 @@
1
1
  import { Switch } from "@specs-feup/clava/api/Joinpoints.js";
2
2
  import MISRARule from "../../MISRARule.js";
3
- import { MISRATransformationReport, MISRATransformationType } from "../../MISRA.js";
3
+ import { AnalysisType, MISRATransformationReport, MISRATransformationType } from "../../MISRA.js";
4
4
  import ClavaJoinPoints from "@specs-feup/clava/api/clava/ClavaJoinPoints.js";
5
- import { getNumOfSwitchClauses, switchHasBooleanCondition, switchHasConditionalBreak } from "../../utils/utils.js";
6
5
  /**
7
- * MISRA Rule 16.4: Every switch statement shall have a default label
6
+ * MISRA-C Rule 16.4: Every switch statement shall have a default label
8
7
  */
9
8
  export default class Rule_16_4_SwitchHasDefault extends MISRARule {
10
- constructor(context) {
11
- super("16.4", context);
9
+ /**
10
+ * Scope of analysis
11
+ */
12
+ analysisType = AnalysisType.SINGLE_TRANSLATION_UNIT;
13
+ /**
14
+ * @returns Rule identifier according to MISRA-C:2012
15
+ */
16
+ get name() {
17
+ return "16.4";
12
18
  }
13
19
  /**
14
20
  * Checks if the given joinpoint is a switch statement with a default case
@@ -25,17 +31,14 @@ export default class Rule_16_4_SwitchHasDefault extends MISRARule {
25
31
  }
26
32
  return noDefaultCase;
27
33
  }
28
- transform($jp) {
34
+ apply($jp) {
29
35
  if (!this.match($jp))
30
36
  return new MISRATransformationReport(MISRATransformationType.NoChange);
31
- if ((getNumOfSwitchClauses($jp) < 2 || switchHasBooleanCondition($jp)) &&
32
- !switchHasConditionalBreak($jp)) { // Will be handled by rules 16.6 or 16.7
33
- return new MISRATransformationReport(MISRATransformationType.NoChange);
34
- }
35
37
  $jp.children[1].lastChild
36
38
  .insertAfter(ClavaJoinPoints.defaultStmt())
37
39
  .insertAfter(ClavaJoinPoints.emptyStmt())
38
40
  .insertAfter(ClavaJoinPoints.breakStmt());
41
+ this.context.addRuleResult(this.ruleID, $jp, MISRATransformationType.DescendantChange);
39
42
  return new MISRATransformationReport(MISRATransformationType.DescendantChange);
40
43
  }
41
44
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Rule_16_4_SwitchHasDefault.js","sourceRoot":"","sources":["../../../src/rules/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACpF,OAAO,eAAe,MAAM,gDAAgD,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAEnH;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,0BAA2B,SAAQ,SAAS;IAC7D,YAAY,OAAqB;QAC7B,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC3B,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,GAAc,EAAE,YAAqB,KAAK;QAC5C,IAAI,CAAC,CAAC,GAAG,YAAY,MAAM,CAAC;YAAE,OAAO,KAAK,CAAC;QAE3C,MAAM,aAAa,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC;QAC1C,IAAI,aAAa,IAAI,SAAS,EAAE,CAAC;YAC7B,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,6CAA6C,CAAC,CAAA;QAC1E,CAAC;QACD,OAAO,aAAa,CAAC;IACzB,CAAC;IAED,SAAS,CAAC,GAAc;QACpB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,yBAAyB,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;QAE7F,IAAI,CAAC,qBAAqB,CAAC,GAAa,CAAC,GAAG,CAAC,IAAI,yBAAyB,CAAC,GAAa,CAAC,CAAC;YACtF,CAAC,yBAAyB,CAAC,GAAa,CAAC,EAAE,CAAC,CAAC,wCAAwC;YACrF,OAAO,IAAI,yBAAyB,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;QAC3E,CAAC;QAED,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;aACpB,WAAW,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC;aAC1C,WAAW,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC;aACxC,WAAW,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC,CAAC;QAC9C,OAAO,IAAI,yBAAyB,CAAC,uBAAuB,CAAC,gBAAgB,CAAC,CAAC;IACnF,CAAC;CACJ"}
1
+ {"version":3,"file":"Rule_16_4_SwitchHasDefault.js","sourceRoot":"","sources":["../../../src/rules/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,SAAS,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAClG,OAAO,eAAe,MAAM,gDAAgD,CAAC;AAE7E;;GAEG;AACH,MAAM,CAAC,OAAO,OAAO,0BAA2B,SAAQ,SAAS;IAC7D;;OAEG;IACM,YAAY,GAAG,YAAY,CAAC,uBAAuB,CAAC;IAE5D;;MAEE;IACH,IAAa,IAAI;QACb,OAAO,MAAM,CAAC;IAClB,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,GAAc,EAAE,YAAqB,KAAK;QAC5C,IAAI,CAAC,CAAC,GAAG,YAAY,MAAM,CAAC;YAAE,OAAO,KAAK,CAAC;QAE3C,MAAM,aAAa,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC;QAC1C,IAAI,aAAa,IAAI,SAAS,EAAE,CAAC;YAC7B,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,6CAA6C,CAAC,CAAA;QAC1E,CAAC;QACD,OAAO,aAAa,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,GAAc;QAChB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;YAChB,OAAO,IAAI,yBAAyB,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC;QAE3E,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;aACpB,WAAW,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC;aAC1C,WAAW,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC;aACxC,WAAW,CAAC,eAAe,CAAC,SAAS,EAAE,CAAC,CAAC;QAE9C,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,uBAAuB,CAAC,gBAAgB,CAAC,CAAC;QACvF,OAAO,IAAI,yBAAyB,CAAC,uBAAuB,CAAC,gBAAgB,CAAC,CAAC;IACnF,CAAC;CACJ"}