@specs-feup/clava-misra 1.0.0 → 1.0.2

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 (352) hide show
  1. package/.gitignore +117 -0
  2. package/README.md +70 -15
  3. package/dist/MISRA.d.ts +129 -0
  4. package/dist/MISRA.d.ts.map +1 -0
  5. package/dist/MISRA.js +245 -0
  6. package/dist/MISRA.js.map +1 -0
  7. package/dist/MISRAContext.d.ts +21 -0
  8. package/dist/MISRAContext.d.ts.map +1 -0
  9. package/dist/MISRAContext.js +75 -0
  10. package/dist/MISRAContext.js.map +1 -0
  11. package/dist/MISRARule.d.ts +56 -0
  12. package/dist/MISRARule.d.ts.map +1 -0
  13. package/dist/MISRARule.js +45 -0
  14. package/dist/MISRARule.js.map +1 -0
  15. package/dist/MISRATool.d.ts +12 -0
  16. package/dist/MISRATool.d.ts.map +1 -0
  17. package/dist/MISRATool.js +84 -0
  18. package/dist/MISRATool.js.map +1 -0
  19. package/dist/foo.d.ts +2 -0
  20. package/dist/foo.d.ts.map +1 -0
  21. package/{src/foo.ts → dist/foo.js} +3 -2
  22. package/dist/foo.js.map +1 -0
  23. package/dist/main.d.ts +2 -0
  24. package/dist/main.d.ts.map +1 -0
  25. package/dist/main.js +5 -0
  26. package/dist/main.js.map +1 -0
  27. package/dist/misra/MISRAAnalyser.d.ts +14 -0
  28. package/dist/misra/MISRAAnalyser.d.ts.map +1 -0
  29. package/{src/misra/MISRAAnalyser.ts → dist/misra/MISRAAnalyser.js} +13 -23
  30. package/dist/misra/MISRAAnalyser.js.map +1 -0
  31. package/dist/misra/MISRAPass.d.ts +27 -0
  32. package/dist/misra/MISRAPass.d.ts.map +1 -0
  33. package/dist/misra/MISRAPass.js +60 -0
  34. package/dist/misra/MISRAPass.js.map +1 -0
  35. package/dist/misra/MISRAPassResult.d.ts +13 -0
  36. package/dist/misra/MISRAPassResult.d.ts.map +1 -0
  37. package/dist/misra/MISRAPassResult.js +11 -0
  38. package/dist/misra/MISRAPassResult.js.map +1 -0
  39. package/dist/misra/MISRAReporter.d.ts +20 -0
  40. package/dist/misra/MISRAReporter.d.ts.map +1 -0
  41. package/dist/misra/MISRAReporter.js +43 -0
  42. package/dist/misra/MISRAReporter.js.map +1 -0
  43. package/dist/misra/passes/S10_EssentialTypePass.d.ts +42 -0
  44. package/dist/misra/passes/S10_EssentialTypePass.d.ts.map +1 -0
  45. package/dist/misra/passes/S10_EssentialTypePass.js +370 -0
  46. package/dist/misra/passes/S10_EssentialTypePass.js.map +1 -0
  47. package/dist/misra/passes/S12_ExpressionPass.d.ts +18 -0
  48. package/dist/misra/passes/S12_ExpressionPass.d.ts.map +1 -0
  49. package/dist/misra/passes/S12_ExpressionPass.js +72 -0
  50. package/dist/misra/passes/S12_ExpressionPass.js.map +1 -0
  51. package/dist/misra/passes/S13_SideEffectPass.d.ts +18 -0
  52. package/dist/misra/passes/S13_SideEffectPass.d.ts.map +1 -0
  53. package/dist/misra/passes/S13_SideEffectPass.js +105 -0
  54. package/dist/misra/passes/S13_SideEffectPass.js.map +1 -0
  55. package/dist/misra/passes/S15_ControlFlowPass.d.ts +19 -0
  56. package/dist/misra/passes/S15_ControlFlowPass.d.ts.map +1 -0
  57. package/dist/misra/passes/S15_ControlFlowPass.js +94 -0
  58. package/dist/misra/passes/S15_ControlFlowPass.js.map +1 -0
  59. package/dist/misra/passes/S16_SwitchStatementPass.d.ts +17 -0
  60. package/dist/misra/passes/S16_SwitchStatementPass.d.ts.map +1 -0
  61. package/dist/misra/passes/S16_SwitchStatementPass.js +152 -0
  62. package/dist/misra/passes/S16_SwitchStatementPass.js.map +1 -0
  63. package/dist/misra/passes/S17_FunctionPass.d.ts +12 -0
  64. package/dist/misra/passes/S17_FunctionPass.d.ts.map +1 -0
  65. package/dist/misra/passes/S17_FunctionPass.js +38 -0
  66. package/dist/misra/passes/S17_FunctionPass.js.map +1 -0
  67. package/dist/misra/passes/S18_PointersArraysPass.d.ts +17 -0
  68. package/dist/misra/passes/S18_PointersArraysPass.d.ts.map +1 -0
  69. package/dist/misra/passes/S18_PointersArraysPass.js +115 -0
  70. package/dist/misra/passes/S18_PointersArraysPass.js.map +1 -0
  71. package/dist/misra/passes/S19_OverlappingStoragePass.d.ts +11 -0
  72. package/dist/misra/passes/S19_OverlappingStoragePass.d.ts.map +1 -0
  73. package/dist/misra/passes/S19_OverlappingStoragePass.js +20 -0
  74. package/dist/misra/passes/S19_OverlappingStoragePass.js.map +1 -0
  75. package/dist/misra/passes/S21_StandardLibPass.d.ts +20 -0
  76. package/dist/misra/passes/S21_StandardLibPass.d.ts.map +1 -0
  77. package/dist/misra/passes/S21_StandardLibPass.js +77 -0
  78. package/dist/misra/passes/S21_StandardLibPass.js.map +1 -0
  79. package/dist/misra/passes/S3_CommentPass.d.ts +12 -0
  80. package/dist/misra/passes/S3_CommentPass.d.ts.map +1 -0
  81. package/dist/misra/passes/S3_CommentPass.js +27 -0
  82. package/dist/misra/passes/S3_CommentPass.js.map +1 -0
  83. package/dist/misra/passes/S5_IdentifierPass.d.ts +13 -0
  84. package/dist/misra/passes/S5_IdentifierPass.d.ts.map +1 -0
  85. package/dist/misra/passes/S5_IdentifierPass.js +60 -0
  86. package/dist/misra/passes/S5_IdentifierPass.js.map +1 -0
  87. package/dist/misra/passes/S6_TypePass.d.ts +11 -0
  88. package/dist/misra/passes/S6_TypePass.d.ts.map +1 -0
  89. package/dist/misra/passes/S6_TypePass.js +25 -0
  90. package/dist/misra/passes/S6_TypePass.js.map +1 -0
  91. package/dist/misra/passes/S7_LiteralsConstantsPass.d.ts +14 -0
  92. package/dist/misra/passes/S7_LiteralsConstantsPass.d.ts.map +1 -0
  93. package/dist/misra/passes/S7_LiteralsConstantsPass.js +71 -0
  94. package/dist/misra/passes/S7_LiteralsConstantsPass.js.map +1 -0
  95. package/dist/misra/passes/S8_DeclDefPass.d.ts +18 -0
  96. package/dist/misra/passes/S8_DeclDefPass.d.ts.map +1 -0
  97. package/dist/misra/passes/S8_DeclDefPass.js +127 -0
  98. package/dist/misra/passes/S8_DeclDefPass.js.map +1 -0
  99. package/dist/misra/sections/Section10_EssentialTypeModel.d.ts +33 -0
  100. package/dist/misra/sections/Section10_EssentialTypeModel.d.ts.map +1 -0
  101. package/{src/misra/sections/Section10_EssentialTypeModel.ts → dist/misra/sections/Section10_EssentialTypeModel.js} +58 -73
  102. package/dist/misra/sections/Section10_EssentialTypeModel.js.map +1 -0
  103. package/dist/misra/sections/Section11_PointerTypeConversions.d.ts +12 -0
  104. package/dist/misra/sections/Section11_PointerTypeConversions.d.ts.map +1 -0
  105. package/{src/misra/sections/Section11_PointerTypeConversions.ts → dist/misra/sections/Section11_PointerTypeConversions.js} +16 -27
  106. package/dist/misra/sections/Section11_PointerTypeConversions.js.map +1 -0
  107. package/dist/misra/sections/Section12_Expressions.d.ts +15 -0
  108. package/dist/misra/sections/Section12_Expressions.d.ts.map +1 -0
  109. package/dist/misra/sections/Section12_Expressions.js +70 -0
  110. package/dist/misra/sections/Section12_Expressions.js.map +1 -0
  111. package/dist/misra/sections/Section13_SideEffects.d.ts +14 -0
  112. package/dist/misra/sections/Section13_SideEffects.d.ts.map +1 -0
  113. package/dist/misra/sections/Section13_SideEffects.js +90 -0
  114. package/dist/misra/sections/Section13_SideEffects.js.map +1 -0
  115. package/dist/misra/sections/Section14_ControlStmtExprs.d.ts +8 -0
  116. package/dist/misra/sections/Section14_ControlStmtExprs.d.ts.map +1 -0
  117. package/{src/misra/sections/Section14_ControlStmtExprs.ts → dist/misra/sections/Section14_ControlStmtExprs.js} +8 -10
  118. package/dist/misra/sections/Section14_ControlStmtExprs.js.map +1 -0
  119. package/dist/misra/sections/Section15_ControlFlow.d.ts +14 -0
  120. package/dist/misra/sections/Section15_ControlFlow.d.ts.map +1 -0
  121. package/dist/misra/sections/Section15_ControlFlow.js +97 -0
  122. package/dist/misra/sections/Section15_ControlFlow.js.map +1 -0
  123. package/dist/misra/sections/Section16_SwitchStatements.d.ts +13 -0
  124. package/dist/misra/sections/Section16_SwitchStatements.d.ts.map +1 -0
  125. package/{src/misra/sections/Section16_SwitchStatements.ts → dist/misra/sections/Section16_SwitchStatements.js} +49 -74
  126. package/dist/misra/sections/Section16_SwitchStatements.js.map +1 -0
  127. package/dist/misra/sections/Section17_Functions.d.ts +9 -0
  128. package/dist/misra/sections/Section17_Functions.d.ts.map +1 -0
  129. package/{src/misra/sections/Section17_Functions.ts → dist/misra/sections/Section17_Functions.js} +10 -13
  130. package/dist/misra/sections/Section17_Functions.js.map +1 -0
  131. package/dist/misra/sections/Section18_PointersAndArrays.d.ts +13 -0
  132. package/dist/misra/sections/Section18_PointersAndArrays.d.ts.map +1 -0
  133. package/{src/misra/sections/Section18_PointersAndArrays.ts → dist/misra/sections/Section18_PointersAndArrays.js} +36 -40
  134. package/dist/misra/sections/Section18_PointersAndArrays.js.map +1 -0
  135. package/dist/misra/sections/Section19_OverlappingStorage.d.ts +8 -0
  136. package/dist/misra/sections/Section19_OverlappingStorage.d.ts.map +1 -0
  137. package/dist/misra/sections/Section19_OverlappingStorage.js +16 -0
  138. package/dist/misra/sections/Section19_OverlappingStorage.js.map +1 -0
  139. package/dist/misra/sections/Section20_PreprocessingDirectives.d.ts +8 -0
  140. package/dist/misra/sections/Section20_PreprocessingDirectives.d.ts.map +1 -0
  141. package/{src/misra/sections/Section20_PreprocessingDirectives.ts → dist/misra/sections/Section20_PreprocessingDirectives.js} +7 -9
  142. package/dist/misra/sections/Section20_PreprocessingDirectives.js.map +1 -0
  143. package/dist/misra/sections/Section21_StandardLibraries.d.ts +17 -0
  144. package/dist/misra/sections/Section21_StandardLibraries.d.ts.map +1 -0
  145. package/dist/misra/sections/Section21_StandardLibraries.js +54 -0
  146. package/dist/misra/sections/Section21_StandardLibraries.js.map +1 -0
  147. package/dist/misra/sections/Section2_UnusedCode.d.ts +9 -0
  148. package/dist/misra/sections/Section2_UnusedCode.d.ts.map +1 -0
  149. package/{src/misra/sections/Section2_UnusedCode.ts → dist/misra/sections/Section2_UnusedCode.js} +11 -16
  150. package/dist/misra/sections/Section2_UnusedCode.js.map +1 -0
  151. package/dist/misra/sections/Section3_Comments.d.ts +9 -0
  152. package/dist/misra/sections/Section3_Comments.d.ts.map +1 -0
  153. package/{src/misra/sections/Section3_Comments.ts → dist/misra/sections/Section3_Comments.js} +7 -10
  154. package/dist/misra/sections/Section3_Comments.js.map +1 -0
  155. package/dist/misra/sections/Section5_Identifiers.d.ts +12 -0
  156. package/dist/misra/sections/Section5_Identifiers.d.ts.map +1 -0
  157. package/dist/misra/sections/Section5_Identifiers.js +139 -0
  158. package/dist/misra/sections/Section5_Identifiers.js.map +1 -0
  159. package/dist/misra/sections/Section6_Types.d.ts +8 -0
  160. package/dist/misra/sections/Section6_Types.d.ts.map +1 -0
  161. package/dist/misra/sections/Section6_Types.js +23 -0
  162. package/dist/misra/sections/Section6_Types.js.map +1 -0
  163. package/dist/misra/sections/Section7_LiteralsConstants.d.ts +11 -0
  164. package/dist/misra/sections/Section7_LiteralsConstants.d.ts.map +1 -0
  165. package/{src/misra/sections/Section7_LiteralsConstants.ts → dist/misra/sections/Section7_LiteralsConstants.js} +18 -25
  166. package/dist/misra/sections/Section7_LiteralsConstants.js.map +1 -0
  167. package/dist/misra/sections/Section8_DeclarationsDefinitions.d.ts +15 -0
  168. package/dist/misra/sections/Section8_DeclarationsDefinitions.d.ts.map +1 -0
  169. package/{src/misra/sections/Section8_DeclarationsDefinitions.ts → dist/misra/sections/Section8_DeclarationsDefinitions.js} +18 -33
  170. package/dist/misra/sections/Section8_DeclarationsDefinitions.js.map +1 -0
  171. package/dist/misra/tests/utils.d.ts +10 -0
  172. package/dist/misra/tests/utils.d.ts.map +1 -0
  173. package/dist/misra/tests/utils.js +33 -0
  174. package/dist/misra/tests/utils.js.map +1 -0
  175. package/dist/rules/Section16_SwitchStatements/Rule_16_2_TopLevelSwitch.d.ts +15 -0
  176. package/dist/rules/Section16_SwitchStatements/Rule_16_2_TopLevelSwitch.d.ts.map +1 -0
  177. package/dist/rules/Section16_SwitchStatements/Rule_16_2_TopLevelSwitch.js +33 -0
  178. package/dist/rules/Section16_SwitchStatements/Rule_16_2_TopLevelSwitch.js.map +1 -0
  179. package/dist/rules/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.d.ts +16 -0
  180. package/dist/rules/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.d.ts.map +1 -0
  181. package/dist/rules/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.js +60 -0
  182. package/dist/rules/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.js.map +1 -0
  183. package/dist/rules/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.d.ts +19 -0
  184. package/dist/rules/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.d.ts.map +1 -0
  185. package/dist/rules/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.js +42 -0
  186. package/dist/rules/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.js.map +1 -0
  187. package/dist/rules/Section16_SwitchStatements/Rule_16_5_DefaultFirstOrLast.d.ts +43 -0
  188. package/dist/rules/Section16_SwitchStatements/Rule_16_5_DefaultFirstOrLast.d.ts.map +1 -0
  189. package/dist/rules/Section16_SwitchStatements/Rule_16_5_DefaultFirstOrLast.js +103 -0
  190. package/dist/rules/Section16_SwitchStatements/Rule_16_5_DefaultFirstOrLast.js.map +1 -0
  191. package/dist/rules/Section16_SwitchStatements/Rule_16_6_SwitchMinTwoClauses.d.ts +26 -0
  192. package/dist/rules/Section16_SwitchStatements/Rule_16_6_SwitchMinTwoClauses.d.ts.map +1 -0
  193. package/dist/rules/Section16_SwitchStatements/Rule_16_6_SwitchMinTwoClauses.js +49 -0
  194. package/dist/rules/Section16_SwitchStatements/Rule_16_6_SwitchMinTwoClauses.js.map +1 -0
  195. package/dist/rules/Section16_SwitchStatements/Rule_16_7_NonBooleanSwitchCondition.d.ts +26 -0
  196. package/dist/rules/Section16_SwitchStatements/Rule_16_7_NonBooleanSwitchCondition.d.ts.map +1 -0
  197. package/dist/rules/Section16_SwitchStatements/Rule_16_7_NonBooleanSwitchCondition.js +49 -0
  198. package/dist/rules/Section16_SwitchStatements/Rule_16_7_NonBooleanSwitchCondition.js.map +1 -0
  199. package/dist/rules/Section17_Functions/Rule_17_4_NonVoidReturn.d.ts +31 -0
  200. package/dist/rules/Section17_Functions/Rule_17_4_NonVoidReturn.d.ts.map +1 -0
  201. package/dist/rules/Section17_Functions/Rule_17_4_NonVoidReturn.js +71 -0
  202. package/dist/rules/Section17_Functions/Rule_17_4_NonVoidReturn.js.map +1 -0
  203. package/dist/rules/Section17_Functions/Rule_17_6_StaticArraySizeParam.d.ts +27 -0
  204. package/dist/rules/Section17_Functions/Rule_17_6_StaticArraySizeParam.d.ts.map +1 -0
  205. package/dist/rules/Section17_Functions/Rule_17_6_StaticArraySizeParam.js +58 -0
  206. package/dist/rules/Section17_Functions/Rule_17_6_StaticArraySizeParam.js.map +1 -0
  207. package/dist/rules/Section17_Functions/Rule_17_7_UnusedReturnValue.d.ts +28 -0
  208. package/dist/rules/Section17_Functions/Rule_17_7_UnusedReturnValue.d.ts.map +1 -0
  209. package/dist/rules/Section17_Functions/Rule_17_7_UnusedReturnValue.js +44 -0
  210. package/dist/rules/Section17_Functions/Rule_17_7_UnusedReturnValue.js.map +1 -0
  211. package/dist/rules/Section20-PreprocessingDirectives/Rule_20_2_InvalidHeaderFileName.d.ts +55 -0
  212. package/dist/rules/Section20-PreprocessingDirectives/Rule_20_2_InvalidHeaderFileName.d.ts.map +1 -0
  213. package/dist/rules/Section20-PreprocessingDirectives/Rule_20_2_InvalidHeaderFileName.js +108 -0
  214. package/dist/rules/Section20-PreprocessingDirectives/Rule_20_2_InvalidHeaderFileName.js.map +1 -0
  215. package/dist/rules/Section2_UnusedCode/Rule_2_3_UnusedTypeDecl.d.ts +43 -0
  216. package/dist/rules/Section2_UnusedCode/Rule_2_3_UnusedTypeDecl.d.ts.map +1 -0
  217. package/dist/rules/Section2_UnusedCode/Rule_2_3_UnusedTypeDecl.js +68 -0
  218. package/dist/rules/Section2_UnusedCode/Rule_2_3_UnusedTypeDecl.js.map +1 -0
  219. package/dist/rules/Section2_UnusedCode/Rule_2_4_UnusedTagDecl.d.ts +29 -0
  220. package/dist/rules/Section2_UnusedCode/Rule_2_4_UnusedTagDecl.d.ts.map +1 -0
  221. package/dist/rules/Section2_UnusedCode/Rule_2_4_UnusedTagDecl.js +53 -0
  222. package/dist/rules/Section2_UnusedCode/Rule_2_4_UnusedTagDecl.js.map +1 -0
  223. package/dist/rules/Section2_UnusedCode/Rule_2_6_UnusedLabels.d.ts +15 -0
  224. package/dist/rules/Section2_UnusedCode/Rule_2_6_UnusedLabels.d.ts.map +1 -0
  225. package/dist/rules/Section2_UnusedCode/Rule_2_6_UnusedLabels.js +35 -0
  226. package/dist/rules/Section2_UnusedCode/Rule_2_6_UnusedLabels.js.map +1 -0
  227. package/dist/rules/Section2_UnusedCode/Rule_2_7_UnusedParameters.d.ts +13 -0
  228. package/dist/rules/Section2_UnusedCode/Rule_2_7_UnusedParameters.d.ts.map +1 -0
  229. package/dist/rules/Section2_UnusedCode/Rule_2_7_UnusedParameters.js +53 -0
  230. package/dist/rules/Section2_UnusedCode/Rule_2_7_UnusedParameters.js.map +1 -0
  231. package/dist/rules/Section3_Comments/Rule_3_1_CommentSequences.d.ts +13 -0
  232. package/dist/rules/Section3_Comments/Rule_3_1_CommentSequences.d.ts.map +1 -0
  233. package/dist/rules/Section3_Comments/Rule_3_1_CommentSequences.js +32 -0
  234. package/dist/rules/Section3_Comments/Rule_3_1_CommentSequences.js.map +1 -0
  235. package/dist/rules/Section3_Comments/Rule_3_2_LineSplicing.d.ts +10 -0
  236. package/dist/rules/Section3_Comments/Rule_3_2_LineSplicing.d.ts.map +1 -0
  237. package/dist/rules/Section3_Comments/Rule_3_2_LineSplicing.js +26 -0
  238. package/dist/rules/Section3_Comments/Rule_3_2_LineSplicing.js.map +1 -0
  239. package/dist/rules/index.d.ts +20 -0
  240. package/dist/rules/index.d.ts.map +1 -0
  241. package/dist/rules/index.js +38 -0
  242. package/dist/rules/index.js.map +1 -0
  243. package/dist/tests/Section17_Functions/misra_config.json +10 -0
  244. package/dist/tests/utils.d.ts +10 -0
  245. package/dist/tests/utils.d.ts.map +1 -0
  246. package/dist/tests/utils.js +29 -0
  247. package/dist/tests/utils.js.map +1 -0
  248. package/dist/utils/utils.d.ts +102 -0
  249. package/dist/utils/utils.d.ts.map +1 -0
  250. package/dist/utils/utils.js +202 -0
  251. package/dist/utils/utils.js.map +1 -0
  252. package/jest.config.js +6 -6
  253. package/package.json +44 -8
  254. package/src/MISRA.ts +276 -0
  255. package/src/MISRAContext.ts +84 -0
  256. package/src/MISRARule.ts +64 -0
  257. package/src/MISRATool.ts +95 -0
  258. package/src/main.ts +4 -33
  259. package/src/misra-old/MISRAAnalyser.ts +60 -0
  260. package/src/misra-old/MISRAAnalyserResult.ts +16 -0
  261. package/src/misra-old/sections/Section10_EssentialTypeModel.ts +377 -0
  262. package/src/misra-old/sections/Section11_PointerTypeConversions.ts +104 -0
  263. package/src/{misra → misra-old}/sections/Section12_Expressions.ts +7 -7
  264. package/src/{misra → misra-old}/sections/Section13_SideEffects.ts +15 -15
  265. package/src/misra-old/sections/Section14_ControlStmtExprs.ts +27 -0
  266. package/src/{misra → misra-old}/sections/Section15_ControlFlow.ts +10 -10
  267. package/src/misra-old/sections/Section18_PointersAndArrays.ts +108 -0
  268. package/src/{misra → misra-old}/sections/Section19_OverlappingStorage.ts +4 -4
  269. package/src/misra-old/sections/Section20_PreprocessingDirectives.ts +22 -0
  270. package/src/misra-old/sections/Section21_StandardLibraries.ts +99 -0
  271. package/src/{misra → misra-old}/sections/Section5_Identifiers.ts +16 -15
  272. package/src/{misra → misra-old}/sections/Section6_Types.ts +4 -4
  273. package/src/misra-old/sections/Section7_LiteralsConstants.ts +76 -0
  274. package/src/misra-old/sections/Section8_DeclarationsDefinitions.ts +133 -0
  275. package/src/rules/Section16_SwitchStatements/Rule_16_2_TopLevelSwitch.ts +41 -0
  276. package/src/rules/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.ts +70 -0
  277. package/src/rules/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.ts +41 -0
  278. package/src/rules/Section16_SwitchStatements/Rule_16_5_DefaultFirstOrLast.ts +113 -0
  279. package/src/rules/Section16_SwitchStatements/Rule_16_6_SwitchMinTwoClauses.ts +61 -0
  280. package/src/rules/Section16_SwitchStatements/Rule_16_7_NonBooleanSwitchCondition.ts +57 -0
  281. package/src/rules/Section17_Functions/Rule_17_3_ImplicitFunction.ts +180 -0
  282. package/src/rules/Section17_Functions/Rule_17_4_NonVoidReturn.ts +91 -0
  283. package/src/rules/Section17_Functions/Rule_17_6_StaticArraySizeParam.ts +68 -0
  284. package/src/rules/Section17_Functions/Rule_17_7_UnusedReturnValue.ts +49 -0
  285. package/src/rules/Section20-PreprocessingDirectives/Rule_20_2_InvalidHeaderFileName.ts +120 -0
  286. package/src/rules/Section2_UnusedCode/Rule_2_3_UnusedTypeDecl.ts +78 -0
  287. package/src/rules/Section2_UnusedCode/Rule_2_4_UnusedTagDecl.ts +61 -0
  288. package/src/rules/Section2_UnusedCode/Rule_2_6_UnusedLabels.ts +47 -0
  289. package/src/rules/Section2_UnusedCode/Rule_2_7_UnusedParameters.ts +67 -0
  290. package/src/rules/Section3_Comments/Rule_3_1_CommentSequences.ts +41 -0
  291. package/src/rules/Section3_Comments/Rule_3_2_LineSplicing.ts +36 -0
  292. package/src/rules/index.ts +44 -0
  293. package/src/tests/Section16_SwitchStatements/Rule_16_2_TopLevelSwitch.test.ts +55 -0
  294. package/src/tests/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.test.ts +70 -0
  295. package/src/tests/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.test.ts +128 -0
  296. package/src/tests/Section16_SwitchStatements/Rule_16_5_DefaultFirstOrLast.test.ts +132 -0
  297. package/src/tests/Section16_SwitchStatements/Rule_16_6_SwitchMinTwoClauses.test.ts +146 -0
  298. package/src/tests/Section16_SwitchStatements/Rule_16_7_NonBooleanSwitchCondition.test.ts +102 -0
  299. package/src/tests/Section17_Functions/Rule_17_3_ImplicitFunctions.test.ts +79 -0
  300. package/src/tests/Section17_Functions/Rule_17_4_NonVoidReturn.test.ts +98 -0
  301. package/src/tests/Section17_Functions/Rule_17_4_NonVoidReturn_MissingConfig.test.ts +77 -0
  302. package/src/tests/Section17_Functions/Rule_17_6_StaticArraySizeParam.test.ts +36 -0
  303. package/src/tests/Section17_Functions/Rule_17_7_UnusedReturnValue.test.ts +44 -0
  304. package/src/tests/Section17_Functions/misra_config.json +19 -0
  305. package/src/tests/Section2_UnusedCode/Rule_2_3_UnusedTypeDecl.test.ts +175 -0
  306. package/src/tests/Section2_UnusedCode/Rule_2_4_UnusedTagDecl.test.ts +219 -0
  307. package/src/tests/Section2_UnusedCode/Rule_2_6_UnusedLabels.test.ts +49 -0
  308. package/src/tests/Section2_UnusedCode/Rule_2_7_UnusedParameters.test.ts +55 -0
  309. package/src/tests/Section3_Comments/Rule_3_1_CommentSequences.test.ts +37 -0
  310. package/src/tests/utils.ts +51 -0
  311. package/src/utils/utils.ts +280 -0
  312. package/tsconfig.json +4 -3
  313. package/typedoc.config.js +1 -1
  314. package/CxxSources/lib.cpp +0 -3
  315. package/CxxSources/lib.h +0 -8
  316. package/CxxSources/main.cpp +0 -40
  317. package/TODO.md +0 -1
  318. package/consumer_order.txt +0 -2
  319. package/enum_integer_type.txt +0 -0
  320. package/is_temporary.txt +0 -0
  321. package/omp.txt +0 -0
  322. package/src/misra/passes/S16_SwitchStatementPass.ts +0 -168
  323. package/src/misra/passes/S3_CommentPass.ts +0 -40
  324. package/src/misra/sections/Section21_StandardLibraries.ts +0 -65
  325. package/src/misra/tests/S10_EssentialTypes.test.ts +0 -253
  326. package/src/misra/tests/S12_Expressions.test.ts +0 -43
  327. package/src/misra/tests/S13_SideEffects.test.ts +0 -77
  328. package/src/misra/tests/S15_ControlFlow.test.ts +0 -144
  329. package/src/misra/tests/S16_SwitchStatements.test.ts +0 -164
  330. package/src/misra/tests/S17_Functions.test.ts +0 -46
  331. package/src/misra/tests/S18_PointersArrays.test.ts +0 -167
  332. package/src/misra/tests/S19_OverlappingStorage.test.ts +0 -38
  333. package/src/misra/tests/S3_Comments.test.ts +0 -36
  334. package/src/misra/tests/S6_Types.test.ts +0 -36
  335. package/src/misra/tests/S7_LiteralsConstants.test.ts +0 -48
  336. package/src/misra/tests/utils.ts +0 -47
  337. package/types_with_templates.txt +0 -0
  338. /package/src/{misra → misra-old}/MISRAPass.ts +0 -0
  339. /package/src/{misra → misra-old}/MISRAPassResult.ts +0 -0
  340. /package/src/{misra → misra-old}/MISRAReporter.ts +0 -0
  341. /package/src/{misra → misra-old}/passes/S10_EssentialTypePass.ts +0 -0
  342. /package/src/{misra → misra-old}/passes/S12_ExpressionPass.ts +0 -0
  343. /package/src/{misra → misra-old}/passes/S13_SideEffectPass.ts +0 -0
  344. /package/src/{misra → misra-old}/passes/S15_ControlFlowPass.ts +0 -0
  345. /package/src/{misra → misra-old}/passes/S17_FunctionPass.ts +0 -0
  346. /package/src/{misra → misra-old}/passes/S18_PointersArraysPass.ts +0 -0
  347. /package/src/{misra → misra-old}/passes/S19_OverlappingStoragePass.ts +0 -0
  348. /package/src/{misra → misra-old}/passes/S21_StandardLibPass.ts +0 -0
  349. /package/src/{misra → misra-old}/passes/S5_IdentifierPass.ts +0 -0
  350. /package/src/{misra → misra-old}/passes/S6_TypePass.ts +0 -0
  351. /package/src/{misra → misra-old}/passes/S7_LiteralsConstantsPass.ts +0 -0
  352. /package/src/{misra → misra-old}/passes/S8_DeclDefPass.ts +0 -0
@@ -0,0 +1,98 @@
1
+ import Query from "@specs-feup/lara/api/weaver/Query.js";
2
+ import { countErrorsAfterCorrection, countMISRAErrors, registerSourceCode, TestFile } from "../utils.js";
3
+ import { FileJp } from "@specs-feup/clava/api/Joinpoints.js";
4
+ import path from "path";
5
+ import { fileURLToPath } from "url";
6
+
7
+ const passingCode = `
8
+ unsigned int test_17_4_1() {
9
+ return 0;
10
+ }`;
11
+
12
+ const failingCode = `
13
+ unsigned int test_17_4_2() {
14
+
15
+ }`;
16
+
17
+ const failingCode2 = `
18
+ float test_17_4_3() {
19
+
20
+ }`;
21
+
22
+ const failingCode3 = `
23
+ enum Status {
24
+ FAIL,
25
+ SUCCESS
26
+ };
27
+
28
+ typedef enum {
29
+ RED,
30
+ GREEN,
31
+ } Color;
32
+
33
+ typedef enum {
34
+ SMALL,
35
+ LARGE
36
+ } Size;
37
+
38
+ typedef unsigned int my_int_type;
39
+
40
+ // Non-compliant
41
+ enum Status test_17_4_3() {
42
+
43
+ }
44
+
45
+ // Non-compliant
46
+ Color test_17_4_4() {
47
+
48
+ }
49
+
50
+ // Non-compliant
51
+ my_int_type test_17_4_5() {
52
+
53
+ }
54
+
55
+ /*
56
+ Non-compliant after correction:
57
+ Config file specifies an invalid default value for 'Size' type (e.g: MEDIUM)
58
+ */
59
+ Size test_17_4_6() {
60
+
61
+ }
62
+
63
+ /*
64
+ Non-compliant after correction:
65
+ Config file do not specify the default value for 'double' type
66
+ */
67
+ double test_17_4_7() {
68
+ }
69
+ `;
70
+
71
+ const files: TestFile[] = [
72
+ { name: "bad1.c", code: failingCode },
73
+ { name: "bad2.c", code: failingCode2 },
74
+ { name: "bad3.c", code: failingCode3 },
75
+ { name: "good.c", code: passingCode },
76
+ ];
77
+
78
+ describe("Rule 17.4", () => {
79
+ registerSourceCode(files);
80
+
81
+ it("should detect errors", () => {
82
+ expect(countMISRAErrors()).toBe(7);
83
+ expect(countMISRAErrors(Query.search(FileJp, { name: "bad1.c" }).first()!)).toBe(1);
84
+ expect(countMISRAErrors(Query.search(FileJp, { name: "bad2.c" }).first()!)).toBe(1);
85
+ expect(countMISRAErrors(Query.search(FileJp, { name: "bad3.c" }).first()!)).toBe(5);
86
+ expect(countMISRAErrors(Query.search(FileJp, { name: "good.c" }).first()!)).toBe(0);
87
+ });
88
+
89
+ it("should correct errors", () => {
90
+ const __filename = fileURLToPath(import.meta.url);
91
+ const __dirname = path.dirname(__filename);
92
+
93
+ const configFilename = "misra_config.json";
94
+ const configFilePath = path.join(__dirname, configFilename);
95
+
96
+ expect(countErrorsAfterCorrection(configFilePath)).toBe(2);
97
+ });
98
+ });
@@ -0,0 +1,77 @@
1
+ import Query from "@specs-feup/lara/api/weaver/Query.js";
2
+ import { countErrorsAfterCorrection, countMISRAErrors, registerSourceCode, TestFile } from "../utils.js";
3
+ import { FileJp } from "@specs-feup/clava/api/Joinpoints.js";
4
+
5
+ const passingCode = `
6
+ unsigned int test_17_4_1() {
7
+ return 0;
8
+ }`;
9
+
10
+ const failingCode = `
11
+ unsigned int test_17_4_2() {
12
+
13
+ }`;
14
+
15
+ const failingCode2 = `
16
+ float test_17_4_3() {
17
+
18
+ }`;
19
+
20
+ const failingCode3 = `
21
+ enum Status {
22
+ FAIL,
23
+ SUCCESS
24
+ };
25
+
26
+ typedef enum {
27
+ RED,
28
+ GREEN,
29
+ } Color;
30
+
31
+ typedef unsigned int my_int_type;
32
+
33
+ // Non-compliant
34
+ enum Status test_17_4_3() {
35
+
36
+ }
37
+
38
+ // Non-compliant
39
+ Color test_17_4_4() {
40
+
41
+ }
42
+
43
+ // Non-compliant
44
+ my_int_type test_17_4_5() {
45
+
46
+ }
47
+
48
+ /*
49
+ Non-compliant after correction:
50
+ Config file do not specify the default value for 'double' type
51
+ */
52
+ double test_17_4_6() {
53
+ }
54
+ `;
55
+
56
+ const files: TestFile[] = [
57
+ { name: "bad1.c", code: failingCode },
58
+ { name: "bad2.c", code: failingCode2 },
59
+ { name: "bad3.c", code: failingCode3 },
60
+ { name: "good.c", code: passingCode },
61
+ ];
62
+
63
+ describe("Rule 17.4 (without config)", () => {
64
+ registerSourceCode(files);
65
+
66
+ it("should detect errors", () => {
67
+ expect(countMISRAErrors()).toBe(6);
68
+ expect(countMISRAErrors(Query.search(FileJp, { name: "bad1.c" }).first()!)).toBe(1);
69
+ expect(countMISRAErrors(Query.search(FileJp, { name: "bad2.c" }).first()!)).toBe(1);
70
+ expect(countMISRAErrors(Query.search(FileJp, { name: "bad3.c" }).first()!)).toBe(4);
71
+ expect(countMISRAErrors(Query.search(FileJp, { name: "good.c" }).first()!)).toBe(0);
72
+ });
73
+
74
+ it("should correct errors", () => {
75
+ expect(countErrorsAfterCorrection()).toBe(6);
76
+ });
77
+ });
@@ -0,0 +1,36 @@
1
+ import Query from "@specs-feup/lara/api/weaver/Query.js";
2
+ import { countErrorsAfterCorrection, countMISRAErrors, registerSourceCode, TestFile } from "../utils.js";
3
+ import { FileJp } from "@specs-feup/clava/api/Joinpoints.js";
4
+
5
+ const passingCode = `
6
+ int test_17_6_1(int my_array[]) {
7
+ return my_array[0];
8
+ }`;
9
+
10
+ const failingCode = `
11
+ int test_17_6_2(int my_array[static 10]) {
12
+ return my_array[0];
13
+ }`;
14
+
15
+ const files: TestFile[] = [
16
+ { name: "bad.c", code: failingCode },
17
+ { name: "good.c", code: passingCode }
18
+ ];
19
+
20
+ describe("Rule 17.6", () => {
21
+ if (process.env.STD_VERSION === "c90") {
22
+ it("should skip tests for c90", () => {});
23
+ } else {
24
+ registerSourceCode(files);
25
+
26
+ it("should detect errors in bad.c", () => {
27
+ expect(countMISRAErrors()).toBe(1);
28
+ expect(countMISRAErrors(Query.search(FileJp, { name: "bad.c" }).first()!)).toBe(1);
29
+ expect(countMISRAErrors(Query.search(FileJp, { name: "good.c" }).first()!)).toBe(0);
30
+ });
31
+
32
+ it("should correct errors in bad.c", () => {
33
+ expect(countErrorsAfterCorrection()).toBe(0);
34
+ });
35
+ }
36
+ });
@@ -0,0 +1,44 @@
1
+ import Query from "@specs-feup/lara/api/weaver/Query.js";
2
+ import { countErrorsAfterCorrection, countMISRAErrors, registerSourceCode, TestFile } from "../utils.js";
3
+ import { FileJp } from "@specs-feup/clava/api/Joinpoints.js";
4
+
5
+ const programCode = `
6
+ void my_void_func() {
7
+ // Void function
8
+ }
9
+
10
+ unsigned int foo() {
11
+ return 0;
12
+ }
13
+
14
+ unsigned int bar(unsigned int n) {
15
+ return n*n;
16
+ }
17
+
18
+ int main() {
19
+ my_void_func(); // Compliant - call to void function
20
+
21
+ unsigned int result = foo();
22
+ (void) bar(foo());
23
+
24
+ foo(); // Non-compliant
25
+
26
+ return 0;
27
+ }
28
+ `;
29
+
30
+ const files: TestFile[] = [
31
+ { name: "program.c", code: programCode }
32
+ ];
33
+
34
+ describe("Rule 17.7", () => {
35
+ registerSourceCode(files);
36
+
37
+ it("should detect errors", () => {
38
+ expect(countMISRAErrors()).toBe(1);
39
+ });
40
+
41
+ it("should correct errors", () => {
42
+ expect(countErrorsAfterCorrection()).toBe(0);
43
+ });
44
+ });
@@ -0,0 +1,19 @@
1
+ {
2
+ "defaultValues": {
3
+ "int": 0,
4
+ "unsigned int": 0,
5
+ "float": 0.0,
6
+ "enum Status": "SUCCESS",
7
+ "Color": "RED",
8
+ "Size": "MEDIUM",
9
+ "my_int_type": 0
10
+ },
11
+ "implicitCalls": {
12
+ "printf": "stdio.h",
13
+ "print": "stdio.h",
14
+ "sin": "math.h",
15
+ "pow": "math.h",
16
+ "half": "math.h",
17
+ "println": "stdio.h"
18
+ }
19
+ }
@@ -0,0 +1,175 @@
1
+ import Query from "@specs-feup/lara/api/weaver/Query.js";
2
+ import { countErrorsAfterCorrection, countMISRAErrors, registerSourceCode, TestFile } from "../utils.js";
3
+ import { EnumDecl, FileJp, RecordJp, TypedefDecl } from "@specs-feup/clava/api/Joinpoints.js";
4
+
5
+ const passingCode = `
6
+ typedef int MyInt;
7
+ typedef MyInt AliasInt;
8
+
9
+ typedef int BasicInt;
10
+ typedef BasicInt* PtrToBasicInt;
11
+
12
+ typedef int MyInt2;
13
+ typedef int MyInt3;
14
+ typedef int MyInt4;
15
+
16
+ typedef struct {
17
+ int x;
18
+ int y;
19
+ MyInt2 i2;
20
+ MyInt3 i3[4];
21
+ MyInt4 *i4;
22
+ } MyStruct;
23
+
24
+ typedef int MyInt5;
25
+ typedef union {
26
+ int x;
27
+ int y;
28
+ MyInt5 i5;
29
+ } MyUnion;
30
+
31
+ typedef int BasicInt2;
32
+ void foo(BasicInt2 x) {
33
+ int a = x + 1;
34
+ }
35
+
36
+ typedef int BasicInt3;
37
+ BasicInt3 bar() {
38
+ return (BasicInt3)10;
39
+ }
40
+
41
+ int main() {
42
+ AliasInt a = 1;
43
+ BasicInt x = 10;
44
+ MyInt4 y = 11;
45
+
46
+ MyStruct myStructInstance = {1, 2, 3, {4, 5, 6, 7}, &y};
47
+
48
+ MyUnion myUnionInstance;
49
+ myUnionInstance.x = 100;
50
+
51
+ PtrToBasicInt ptr = &x;
52
+
53
+ return 0;
54
+ }`;
55
+
56
+ // 3 errors
57
+ const failingCode1 = `
58
+ typedef int OtherInt;
59
+
60
+ // Unused type defs
61
+ typedef OtherInt** OtherPointer;
62
+ typedef int MyUnusedType;
63
+ typedef int** MyUnusedPointer;
64
+ `;
65
+
66
+ // 4 errors, where 1 is the unused tag decl
67
+ const failingCode2 = `
68
+ // Should be removed
69
+ typedef struct {
70
+ int x;
71
+ int y;
72
+ } MyUnusedStruct;
73
+
74
+ // Should be removed
75
+ typedef struct NumberEnum {
76
+ int x;
77
+ int y;
78
+ } MyUnusedStruct2;
79
+
80
+ // Should be replaced by the struct
81
+ typedef struct PersonStruct {
82
+ int id;
83
+ char name[10];
84
+ } Person;
85
+ struct PersonStruct personInstance = {1, "Alice"};
86
+ `;
87
+
88
+ // 4 errors, one is from the other class
89
+ const failingCode3 = `
90
+ // Should be removed
91
+ typedef union {
92
+ int x;
93
+ int y;
94
+ } MyUnusedUnion1;
95
+
96
+ // Should be removed
97
+ typedef union NumberUnion1 {
98
+ int x;
99
+ int y;
100
+ } MyUnusedUnion2;
101
+
102
+ // Should be replaced by the union
103
+ typedef union NumberUnion {
104
+ int intValue;
105
+ float floatValue;
106
+ } Number;
107
+
108
+ union NumberUnion unionInst = {.intValue = 10};
109
+ `;
110
+
111
+ // 4 errors, one is from the other class
112
+ const failingCode4 = `
113
+ // Should be removed
114
+ typedef enum {
115
+ A1,
116
+ B1,
117
+ C1
118
+ } MyUnusedEnum;
119
+
120
+ // Should be removed
121
+ typedef enum ColorEnum2 {
122
+ YELLOW,
123
+ BROWN,
124
+ WHITE
125
+ } Color2;
126
+
127
+ // Should be replaced by the enum
128
+ typedef enum ColorEnum {
129
+ RED,
130
+ GREEN,
131
+ BLUE
132
+ } Color;
133
+ enum ColorEnum colorInstance = GREEN;
134
+ `;
135
+
136
+ const files: TestFile[] = [
137
+ { name: "bad1.c", code: failingCode1 },
138
+ { name: "bad2.c", code: failingCode2 },
139
+ { name: "bad3.c", code: failingCode3 },
140
+ { name: "bad4.c", code: failingCode4 },
141
+ { name: "good.c", code: passingCode }
142
+ ];
143
+
144
+ describe("Rule 2.3", () => {
145
+ registerSourceCode(files);
146
+
147
+ it("should detect errors in bad.c", () => {
148
+ expect(countMISRAErrors()).toBe(15);
149
+
150
+ expect(countMISRAErrors(Query.search(FileJp, {name: "bad1.c"}).first()!)).toBe(3);
151
+ expect(countMISRAErrors(Query.search(FileJp, {name: "bad2.c"}).first()!)).toBe(4);
152
+ expect(countMISRAErrors(Query.search(FileJp, {name: "bad3.c"}).first()!)).toBe(4);
153
+ expect(countMISRAErrors(Query.search(FileJp, {name: "bad4.c"}).first()!)).toBe(4);
154
+ expect(countMISRAErrors(Query.search(FileJp, {name: "good.c"}).first()!)).toBe(0);
155
+ });
156
+
157
+ it("should correct errors in bad.c", () => {
158
+ expect(countErrorsAfterCorrection()).toBe(0);
159
+
160
+ const badFile1 = Query.search(FileJp, {name: "bad1.c"}).first()!;
161
+ expect(Query.searchFrom(badFile1, TypedefDecl).get().length).toBe(0);
162
+
163
+ const badFile2 = Query.search(FileJp, {name: "bad2.c"}).first()!;
164
+ expect(Query.searchFrom(badFile2, TypedefDecl).get().length).toBe(0);
165
+ expect(Query.searchFrom(badFile2, RecordJp).get().length).toBe(1);
166
+
167
+ const badFile3 = Query.search(FileJp, {name: "bad3.c"}).first()!;
168
+ expect(Query.searchFrom(badFile3, TypedefDecl).get().length).toBe(0);
169
+ expect(Query.searchFrom(badFile3, RecordJp).get().length).toBe(1);
170
+
171
+ const badFile4 = Query.search(FileJp, {name: "bad4.c"}).first()!;
172
+ expect(Query.searchFrom(badFile4, TypedefDecl).get().length).toBe(0);
173
+ expect(Query.searchFrom(badFile4, EnumDecl).get().length).toBe(1);
174
+ });
175
+ });
@@ -0,0 +1,219 @@
1
+ import Query from "@specs-feup/lara/api/weaver/Query.js";
2
+ import { countErrorsAfterCorrection, countMISRAErrors, registerSourceCode, TestFile } from "../utils.js";
3
+ import { FileJp } from "@specs-feup/clava/api/Joinpoints.js";
4
+
5
+ const failingCodeEnum1 = `
6
+ enum MyEnum {
7
+ RED, GREEN, BLUE
8
+ };
9
+
10
+ enum EnumForCast1 {
11
+ RED2, GREEN2, BLUE2
12
+ };
13
+
14
+ enum EnumForCast2 {
15
+ RED3, GREEN3, BLUE3
16
+ };
17
+
18
+ enum MyEnum2 {
19
+ RED4, GREEN4, BLUE4
20
+ };
21
+
22
+ enum EnumForPtr {
23
+ RED5, GREEN5, BLUE5
24
+ };
25
+
26
+ enum EnumForArray {
27
+ RED6, GREEN6, BLUE6
28
+ };
29
+
30
+ // Non-compliant
31
+ enum UnusedEnum {
32
+ RED7, GREEN7, BLUE7
33
+ };
34
+
35
+ void enumAsParam(enum MyEnum color) {
36
+ int i;
37
+ if (color == RED) {
38
+ i = 1;
39
+ }
40
+ }
41
+
42
+ enum EnumForCast1 enumAsReturn() {
43
+ return (enum EnumForCast1) RED2;
44
+ };
45
+
46
+ enum EnumForCast2 enumAsReturn2() {
47
+ int id = 2;
48
+ return (enum EnumForCast2) id;
49
+ };
50
+
51
+ enum MyEnum2 color_enum = RED4;
52
+
53
+ enum EnumForPtr *colorPtr;
54
+
55
+ enum EnumForArray colorArray[3];
56
+ `;
57
+
58
+ const failingCodeEnum2 = `
59
+ typedef enum {
60
+ A1,
61
+ B1,
62
+ C1
63
+ } ColorEnum2;
64
+ ColorEnum2 colorEnum2 = A1;
65
+
66
+ typedef enum MyColors {
67
+ A2,
68
+ B3,
69
+ C4
70
+ } ColorOption;
71
+ enum MyColors my_color = A2;
72
+ ColorOption color_option = B3;
73
+
74
+ // MyColors2 tag should be removed
75
+ typedef enum MyColors2 {
76
+ A5,
77
+ B6,
78
+ C7
79
+ } ColorOption2;
80
+ ColorOption2 color2 = B6;
81
+ `;
82
+
83
+ const failingCodeStruct1 = `
84
+ struct MyStruct {
85
+ int x;
86
+ float y;
87
+ };
88
+
89
+ struct StructForReturn1 {
90
+ int x;
91
+ float y;
92
+ };
93
+
94
+ struct MyStruct2 {
95
+ int x;
96
+ float y;
97
+ };
98
+
99
+ struct StructForPtr {
100
+ int x;
101
+ float y;
102
+ };
103
+
104
+ struct StructForArray {
105
+ int x;
106
+ float y;
107
+ };
108
+
109
+ // Non-compliant: should be removed
110
+ struct UnusedStruct {
111
+ int x;
112
+ float y;
113
+ };
114
+
115
+ void structAsParam(struct MyStruct s) {
116
+ int xField = s.x;
117
+ }
118
+
119
+ struct StructForReturn1 structAsReturn() {
120
+ return (struct StructForReturn1){1, 1.5f};
121
+ }
122
+
123
+ struct MyStruct2 myStruct = {10, 20.5f};
124
+ struct StructForPtr *structPtr;
125
+ struct StructForArray structArray[3];
126
+ `;
127
+
128
+ const failingCodeStruct2 = `
129
+ typedef struct {
130
+ int x;
131
+ float y;
132
+ } ColorStruct;
133
+ ColorStruct colorStruct = {1, 2.5};
134
+
135
+ typedef struct MyStruct5 {
136
+ int x;
137
+ float y;
138
+ } ColorStruct2;
139
+ struct MyStruct5 struct5 = {2, 4.5};
140
+ ColorStruct2 colorStruct2 = {1, 2.5};
141
+
142
+ // Violation: MyStruct3 tag will be removed
143
+ typedef struct MyStruct3 {
144
+ int x;
145
+ float y;
146
+ } ColorStruct3;
147
+ ColorStruct3 colorStruct3 = {10, 5.5};
148
+ `;
149
+
150
+ const failingCodeUnion1 = `
151
+ union MyUnion {
152
+ int x;
153
+ float y;
154
+ };
155
+
156
+ union UnionForReturn1 {
157
+ int x;
158
+ float y;
159
+ };
160
+
161
+ union MyUnion2 {
162
+ int x;
163
+ float y;
164
+ };
165
+
166
+ union UnionForPtr {
167
+ int x;
168
+ float y;
169
+ };
170
+
171
+ union UnionForArray {
172
+ int x;
173
+ float y;
174
+ };
175
+
176
+ // Non-compliant: should be removed
177
+ union UnusedUnion {
178
+ int x;
179
+ float y;
180
+ };
181
+
182
+ void unionAsParam(union MyUnion u) {
183
+ int xField = u.x;
184
+ }
185
+
186
+ union UnionForReturn1 unionAsReturn() {
187
+ return (union UnionForReturn1){.x = 1};
188
+ }
189
+
190
+ union MyUnion2 myUnion = {.y = 20.5f};
191
+ union UnionForPtr *unionPtr;
192
+ union UnionForArray unionArray[3];
193
+ `;
194
+
195
+ const files: TestFile[] = [
196
+ { name: "testEnum1.c", code: failingCodeEnum1 },
197
+ { name: "testEnum2.c", code: failingCodeEnum2 },
198
+ { name: "testStruct1.c", code: failingCodeStruct1 },
199
+ { name: "testStruct2.c", code: failingCodeStruct2 },
200
+ { name: "testUnion1.c", code: failingCodeUnion1 },
201
+ ];
202
+
203
+ describe("Rule 2.4", () => {
204
+ registerSourceCode(files);
205
+
206
+ it("should detect errors in bad.c", () => {
207
+ expect(countMISRAErrors()).toBe(5);
208
+
209
+ expect(countMISRAErrors(Query.search(FileJp, {name: "testEnum1.c"}).first()!)).toBe(1);
210
+ expect(countMISRAErrors(Query.search(FileJp, {name: "testEnum2.c"}).first()!)).toBe(1);
211
+ expect(countMISRAErrors(Query.search(FileJp, {name: "testStruct1.c"}).first()!)).toBe(1);
212
+ expect(countMISRAErrors(Query.search(FileJp, {name: "testStruct2.c"}).first()!)).toBe(1);
213
+ expect(countMISRAErrors(Query.search(FileJp, {name: "testUnion1.c"}).first()!)).toBe(1);
214
+ });
215
+
216
+ it("should correct errors in bad.c", () => {
217
+ expect(countErrorsAfterCorrection()).toBe(0);
218
+ });
219
+ });