@specs-feup/clava-misra 1.0.0 → 1.0.1

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 (350) 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 +40 -8
  254. package/src/MISRA.ts +266 -0
  255. package/src/MISRAContext.ts +91 -0
  256. package/src/MISRARule.ts +77 -0
  257. package/src/MISRATool.ts +96 -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 +40 -0
  276. package/src/rules/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.ts +69 -0
  277. package/src/rules/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.ts +46 -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 +57 -0
  280. package/src/rules/Section16_SwitchStatements/Rule_16_7_NonBooleanSwitchCondition.ts +56 -0
  281. package/src/rules/Section17_Functions/Rule_17_4_NonVoidReturn.ts +78 -0
  282. package/src/rules/Section17_Functions/Rule_17_6_StaticArraySizeParam.ts +68 -0
  283. package/src/rules/Section17_Functions/Rule_17_7_UnusedReturnValue.ts +47 -0
  284. package/src/rules/Section20-PreprocessingDirectives/Rule_20_2_InvalidHeaderFileName.ts +120 -0
  285. package/src/rules/Section2_UnusedCode/Rule_2_3_UnusedTypeDecl.ts +75 -0
  286. package/src/rules/Section2_UnusedCode/Rule_2_4_UnusedTagDecl.ts +60 -0
  287. package/src/rules/Section2_UnusedCode/Rule_2_6_UnusedLabels.ts +46 -0
  288. package/src/rules/Section2_UnusedCode/Rule_2_7_UnusedParameters.ts +65 -0
  289. package/src/rules/Section3_Comments/Rule_3_1_CommentSequences.ts +41 -0
  290. package/src/rules/Section3_Comments/Rule_3_2_LineSplicing.ts +36 -0
  291. package/src/rules/index.ts +40 -0
  292. package/src/tests/Section16_SwitchStatements/Rule_16_2_TopLevelSwitch.test.ts +55 -0
  293. package/src/tests/Section16_SwitchStatements/Rule_16_3_UnconditionalBreak.test.ts +70 -0
  294. package/src/tests/Section16_SwitchStatements/Rule_16_4_SwitchHasDefault.test.ts +128 -0
  295. package/src/tests/Section16_SwitchStatements/Rule_16_5_DefaultFirstOrLast.test.ts +132 -0
  296. package/src/tests/Section16_SwitchStatements/Rule_16_6_SwitchMinTwoClauses.test.ts +146 -0
  297. package/src/tests/Section16_SwitchStatements/Rule_16_7_NonBooleanSwitchCondition.test.ts +102 -0
  298. package/src/tests/Section17_Functions/Rule_17_4_NonVoidReturn.test.ts +85 -0
  299. package/src/tests/Section17_Functions/Rule_17_4_NonVoidReturn_MissingConfig.test.ts +77 -0
  300. package/src/tests/Section17_Functions/Rule_17_6_StaticArraySizeParam.test.ts +36 -0
  301. package/src/tests/Section17_Functions/Rule_17_7_UnusedReturnValue.test.ts +44 -0
  302. package/src/tests/Section17_Functions/misra_config.json +10 -0
  303. package/src/tests/Section2_UnusedCode/Rule_2_3_UnusedTypeDecl.test.ts +175 -0
  304. package/src/tests/Section2_UnusedCode/Rule_2_4_UnusedTagDecl.test.ts +219 -0
  305. package/src/tests/Section2_UnusedCode/Rule_2_6_UnusedLabels.test.ts +49 -0
  306. package/src/tests/Section2_UnusedCode/Rule_2_7_UnusedParameters.test.ts +55 -0
  307. package/src/tests/Section3_Comments/Rule_3_1_CommentSequences.test.ts +37 -0
  308. package/src/tests/utils.ts +39 -0
  309. package/src/utils/utils.ts +221 -0
  310. package/tsconfig.json +4 -3
  311. package/typedoc.config.js +1 -1
  312. package/CxxSources/lib.cpp +0 -3
  313. package/CxxSources/lib.h +0 -8
  314. package/CxxSources/main.cpp +0 -40
  315. package/TODO.md +0 -1
  316. package/consumer_order.txt +0 -2
  317. package/enum_integer_type.txt +0 -0
  318. package/is_temporary.txt +0 -0
  319. package/omp.txt +0 -0
  320. package/src/misra/passes/S16_SwitchStatementPass.ts +0 -168
  321. package/src/misra/passes/S3_CommentPass.ts +0 -40
  322. package/src/misra/sections/Section21_StandardLibraries.ts +0 -65
  323. package/src/misra/tests/S10_EssentialTypes.test.ts +0 -253
  324. package/src/misra/tests/S12_Expressions.test.ts +0 -43
  325. package/src/misra/tests/S13_SideEffects.test.ts +0 -77
  326. package/src/misra/tests/S15_ControlFlow.test.ts +0 -144
  327. package/src/misra/tests/S16_SwitchStatements.test.ts +0 -164
  328. package/src/misra/tests/S17_Functions.test.ts +0 -46
  329. package/src/misra/tests/S18_PointersArrays.test.ts +0 -167
  330. package/src/misra/tests/S19_OverlappingStorage.test.ts +0 -38
  331. package/src/misra/tests/S3_Comments.test.ts +0 -36
  332. package/src/misra/tests/S6_Types.test.ts +0 -36
  333. package/src/misra/tests/S7_LiteralsConstants.test.ts +0 -48
  334. package/src/misra/tests/utils.ts +0 -47
  335. package/types_with_templates.txt +0 -0
  336. /package/src/{misra → misra-old}/MISRAPass.ts +0 -0
  337. /package/src/{misra → misra-old}/MISRAPassResult.ts +0 -0
  338. /package/src/{misra → misra-old}/MISRAReporter.ts +0 -0
  339. /package/src/{misra → misra-old}/passes/S10_EssentialTypePass.ts +0 -0
  340. /package/src/{misra → misra-old}/passes/S12_ExpressionPass.ts +0 -0
  341. /package/src/{misra → misra-old}/passes/S13_SideEffectPass.ts +0 -0
  342. /package/src/{misra → misra-old}/passes/S15_ControlFlowPass.ts +0 -0
  343. /package/src/{misra → misra-old}/passes/S17_FunctionPass.ts +0 -0
  344. /package/src/{misra → misra-old}/passes/S18_PointersArraysPass.ts +0 -0
  345. /package/src/{misra → misra-old}/passes/S19_OverlappingStoragePass.ts +0 -0
  346. /package/src/{misra → misra-old}/passes/S21_StandardLibPass.ts +0 -0
  347. /package/src/{misra → misra-old}/passes/S5_IdentifierPass.ts +0 -0
  348. /package/src/{misra → misra-old}/passes/S6_TypePass.ts +0 -0
  349. /package/src/{misra → misra-old}/passes/S7_LiteralsConstantsPass.ts +0 -0
  350. /package/src/{misra → misra-old}/passes/S8_DeclDefPass.ts +0 -0
@@ -0,0 +1,42 @@
1
+ import { LaraJoinPoint } from "@specs-feup/lara/api/LaraJoinPoint.js";
2
+ import MISRAPass from "../MISRAPass.js";
3
+ import { PreprocessingReqs } from "../MISRAReporter.js";
4
+ import { Expression, Type } from "@specs-feup/clava/api/Joinpoints.js";
5
+ export declare enum EssentialTypes {
6
+ UNSIGNED = "unsigned",
7
+ CHAR = "char",
8
+ SIGNED = "signed",
9
+ ENUM = "enum",
10
+ FLOAT = "float",
11
+ BOOL = "bool",
12
+ UNKOWN = "unkown"
13
+ }
14
+ export interface EssentialType {
15
+ category: EssentialTypes;
16
+ enumName?: string;
17
+ }
18
+ export default class S10_EssentialTypePass extends MISRAPass {
19
+ protected _preprocessingReqs: PreprocessingReqs[];
20
+ initRuleMapper(): void;
21
+ matchJoinpoint($jp: LaraJoinPoint): boolean;
22
+ static getEssentialType(bType: Type): EssentialType;
23
+ static isInteger($et: EssentialTypes): boolean;
24
+ static getExprEssentialType($expr: Expression): EssentialType;
25
+ private restrictOperand;
26
+ private restrictOperandList;
27
+ private r10_1_appropriateEssentialOperands;
28
+ private r10_2_appropriateCharOperands;
29
+ private static isAssignable;
30
+ private r10_3_noInvalidAssignments;
31
+ private static checkBoolSource;
32
+ private r10_5_noInvalidCasts;
33
+ private static isCompositeBinaryExpr;
34
+ private static isCompositeExpr;
35
+ private static compositeExprWidth;
36
+ private static transformBinaryOp;
37
+ private static transformTernaryOp;
38
+ private r10_6_noWiderCompositeExprAssignments;
39
+ private r10_8_noWiderCompositeCasts;
40
+ protected _name: string;
41
+ }
42
+ //# sourceMappingURL=S10_EssentialTypePass.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"S10_EssentialTypePass.d.ts","sourceRoot":"","sources":["../../../src/misra/passes/S10_EssentialTypePass.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AACtE,OAAO,SAAS,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAA+C,UAAU,EAAiF,IAAI,EAAoB,MAAM,qCAAqC,CAAC;AAIrN,oBAAY,cAAc;IACtB,QAAQ,aAAa;IACrB,IAAI,SAAS;IACb,MAAM,WAAW;IACjB,IAAI,SAAS;IACb,KAAK,UAAU;IACf,IAAI,SAAS;IACb,MAAM,WAAW;CACpB;AAED,MAAM,WAAW,aAAa;IAC1B,QAAQ,EAAE,cAAc,CAAC;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,CAAC,OAAO,OAAO,qBAAsB,SAAQ,SAAS;IACxD,SAAS,CAAC,kBAAkB,EAAE,iBAAiB,EAAE,CAAM;IAEvD,cAAc,IAAI,IAAI;IAWtB,cAAc,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO;IAI3C,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,IAAI,GAAG,aAAa;IA8BnD,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,cAAc,GAAG,OAAO;IAI9C,MAAM,CAAC,oBAAoB,CAAC,KAAK,EAAE,UAAU,GAAG,aAAa;IAmB7D,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,mBAAmB;IAM3B,OAAO,CAAC,kCAAkC;IAwD1C,OAAO,CAAC,6BAA6B;IAqCrC,OAAO,CAAC,MAAM,CAAC,YAAY;IAa3B,OAAO,CAAC,0BAA0B;IAuClC,OAAO,CAAC,MAAM,CAAC,eAAe;IAU9B,OAAO,CAAC,oBAAoB;IA2B5B,OAAO,CAAC,MAAM,CAAC,qBAAqB;IAIpC,OAAO,CAAC,MAAM,CAAC,eAAe;IAiB9B,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAiBjC,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAIhC,OAAO,CAAC,MAAM,CAAC,kBAAkB;IAcjC,OAAO,CAAC,qCAAqC;IAqB7C,OAAO,CAAC,2BAA2B;IAwBnC,SAAS,CAAC,KAAK,EAAE,MAAM,CAA0B;CAEpD"}
@@ -0,0 +1,370 @@
1
+ import MISRAPass from "../MISRAPass.js";
2
+ import { BinaryOp, BuiltinType, Call, Cast, EnumType, Expression, IntLiteral, ParenExpr, QualType, ReturnStmt, TernaryOp, UnaryOp, Vardecl } from "@specs-feup/clava/api/Joinpoints.js";
3
+ import ClavaJoinPoints from "@specs-feup/clava/api/clava/ClavaJoinPoints.js";
4
+ import Fix from "@specs-feup/clava/api/clava/analysis/Fix.js";
5
+ export var EssentialTypes;
6
+ (function (EssentialTypes) {
7
+ EssentialTypes["UNSIGNED"] = "unsigned";
8
+ EssentialTypes["CHAR"] = "char";
9
+ EssentialTypes["SIGNED"] = "signed";
10
+ EssentialTypes["ENUM"] = "enum";
11
+ EssentialTypes["FLOAT"] = "float";
12
+ EssentialTypes["BOOL"] = "bool";
13
+ EssentialTypes["UNKOWN"] = "unkown";
14
+ })(EssentialTypes || (EssentialTypes = {}));
15
+ ;
16
+ export default class S10_EssentialTypePass extends MISRAPass {
17
+ _preprocessingReqs = [];
18
+ initRuleMapper() {
19
+ this._ruleMapper = new Map([
20
+ [1, this.r10_1_appropriateEssentialOperands.bind(this)],
21
+ [2, this.r10_2_appropriateCharOperands.bind(this)],
22
+ [3, this.r10_3_noInvalidAssignments.bind(this)],
23
+ [5, this.r10_5_noInvalidCasts.bind(this)],
24
+ [6, this.r10_6_noWiderCompositeExprAssignments.bind(this)],
25
+ [8, this.r10_8_noWiderCompositeCasts.bind(this)]
26
+ ]);
27
+ }
28
+ matchJoinpoint($jp) {
29
+ return $jp instanceof Expression || $jp instanceof Vardecl || $jp instanceof ReturnStmt;
30
+ }
31
+ static getEssentialType(bType) {
32
+ let type = bType.desugarAll;
33
+ while (type instanceof QualType) {
34
+ type = type.unqualifiedType.desugarAll;
35
+ }
36
+ if (type instanceof BuiltinType) {
37
+ if (type.builtinKind === "Bool") {
38
+ return { category: EssentialTypes.BOOL };
39
+ }
40
+ else if (type.builtinKind === "Char_S") {
41
+ return { category: EssentialTypes.CHAR };
42
+ }
43
+ else if (type.isInteger && type.isSigned === true) {
44
+ return { category: EssentialTypes.SIGNED };
45
+ }
46
+ else if (type.isInteger && type.isSigned === false) {
47
+ return { category: EssentialTypes.UNSIGNED };
48
+ }
49
+ else if (type.isFloat) {
50
+ return { category: EssentialTypes.FLOAT };
51
+ }
52
+ }
53
+ else if (type instanceof EnumType) {
54
+ return type.name === "" ? { category: EssentialTypes.SIGNED } : { category: EssentialTypes.ENUM, enumName: type.name };
55
+ }
56
+ return { category: EssentialTypes.UNKOWN };
57
+ }
58
+ static isInteger($et) {
59
+ return $et === EssentialTypes.SIGNED || $et === EssentialTypes.UNSIGNED;
60
+ }
61
+ static getExprEssentialType($expr) {
62
+ if ($expr instanceof BinaryOp) {
63
+ if ($expr.kind === "add") {
64
+ if ((this.getExprEssentialType($expr.left).category === EssentialTypes.CHAR && this.isInteger(this.getExprEssentialType($expr.right).category))
65
+ || (this.getExprEssentialType($expr.right).category === EssentialTypes.CHAR && this.isInteger(this.getExprEssentialType($expr.left).category))) {
66
+ return { category: EssentialTypes.CHAR };
67
+ }
68
+ }
69
+ else if ($expr.kind === "sub") {
70
+ if (this.getExprEssentialType($expr.left).category === EssentialTypes.CHAR) {
71
+ if (this.getExprEssentialType($expr.right).category === EssentialTypes.CHAR) {
72
+ return { category: EssentialTypes.CHAR };
73
+ }
74
+ }
75
+ }
76
+ }
77
+ return this.getEssentialType($expr.type);
78
+ }
79
+ restrictOperand($expr, $restrictedType, $baseExpr, $castTo) {
80
+ const et = S10_EssentialTypePass.getExprEssentialType($expr);
81
+ if (et.category === $restrictedType) {
82
+ const fix = $castTo ? new Fix($expr, ($jp) => {
83
+ $jp.replaceWith(ClavaJoinPoints.cStyleCast($castTo, $jp));
84
+ }) : undefined;
85
+ this.logMISRAError(`Operand ${$expr.code} of expression ${$baseExpr.code} must not have essentially ${et.category} type.`, fix);
86
+ }
87
+ }
88
+ restrictOperandList($expr, $restrictedTypes, $baseExpr, $castTo) {
89
+ for (const type of $restrictedTypes) {
90
+ this.restrictOperand($expr, type, $baseExpr, $castTo);
91
+ }
92
+ }
93
+ r10_1_appropriateEssentialOperands($startNode) {
94
+ if ($startNode instanceof TernaryOp) {
95
+ this.restrictOperandList($startNode.cond, [EssentialTypes.CHAR, EssentialTypes.ENUM, EssentialTypes.FLOAT, EssentialTypes.SIGNED, EssentialTypes.UNSIGNED], $startNode);
96
+ }
97
+ else if ($startNode instanceof BinaryOp) {
98
+ switch ($startNode.kind) {
99
+ case "shl":
100
+ case "shr":
101
+ if (!($startNode.right instanceof IntLiteral))
102
+ this.restrictOperand($startNode.right, EssentialTypes.SIGNED, $startNode);
103
+ case "and":
104
+ case "or":
105
+ case "x_or":
106
+ this.restrictOperand($startNode.left, EssentialTypes.SIGNED, $startNode);
107
+ if ($startNode.kind !== "shl" && $startNode.kind !== "shr")
108
+ this.restrictOperand($startNode.right, EssentialTypes.SIGNED, $startNode);
109
+ case "rem":
110
+ this.restrictOperand($startNode.left, EssentialTypes.FLOAT, $startNode);
111
+ this.restrictOperand($startNode.right, EssentialTypes.FLOAT, $startNode);
112
+ case "mul":
113
+ case "div":
114
+ this.restrictOperand($startNode.left, EssentialTypes.CHAR, $startNode);
115
+ this.restrictOperand($startNode.right, EssentialTypes.CHAR, $startNode);
116
+ case "add":
117
+ case "sub":
118
+ this.restrictOperand($startNode.left, EssentialTypes.ENUM, $startNode);
119
+ this.restrictOperand($startNode.right, EssentialTypes.ENUM, $startNode);
120
+ case "le":
121
+ case "ge":
122
+ case "lt":
123
+ case "gt":
124
+ this.restrictOperand($startNode.left, EssentialTypes.BOOL, $startNode);
125
+ this.restrictOperand($startNode.right, EssentialTypes.BOOL, $startNode);
126
+ break;
127
+ case "l_and":
128
+ case "l_or":
129
+ this.restrictOperandList($startNode.left, [EssentialTypes.ENUM, EssentialTypes.CHAR, EssentialTypes.SIGNED, EssentialTypes.UNSIGNED, EssentialTypes.FLOAT], $startNode);
130
+ this.restrictOperandList($startNode.right, [EssentialTypes.ENUM, EssentialTypes.CHAR, EssentialTypes.SIGNED, EssentialTypes.UNSIGNED, EssentialTypes.FLOAT], $startNode);
131
+ break;
132
+ }
133
+ }
134
+ else if ($startNode instanceof UnaryOp) {
135
+ switch ($startNode.kind) {
136
+ case "minus":
137
+ this.restrictOperand($startNode.operand, EssentialTypes.UNSIGNED, $startNode);
138
+ case "plus":
139
+ this.restrictOperandList($startNode.operand, [EssentialTypes.BOOL, EssentialTypes.CHAR, EssentialTypes.ENUM], $startNode);
140
+ break;
141
+ case "l_not":
142
+ this.restrictOperandList($startNode.operand, [EssentialTypes.ENUM, EssentialTypes.CHAR, EssentialTypes.SIGNED, EssentialTypes.UNSIGNED, EssentialTypes.FLOAT], $startNode);
143
+ break;
144
+ case "not":
145
+ this.restrictOperandList($startNode.operand, [EssentialTypes.BOOL, EssentialTypes.CHAR, EssentialTypes.ENUM, EssentialTypes.FLOAT, EssentialTypes.SIGNED], $startNode);
146
+ break;
147
+ }
148
+ }
149
+ }
150
+ r10_2_appropriateCharOperands($startNode) {
151
+ if (!($startNode instanceof BinaryOp))
152
+ return;
153
+ if ($startNode.kind === "add") {
154
+ if (S10_EssentialTypePass.getExprEssentialType($startNode.left).category === EssentialTypes.CHAR && S10_EssentialTypePass.getExprEssentialType($startNode.right).category === EssentialTypes.CHAR) {
155
+ this.logMISRAError(`Both operands of addition ${$startNode.code} have essentially character type.`);
156
+ return;
157
+ }
158
+ let otherType;
159
+ if (S10_EssentialTypePass.getExprEssentialType($startNode.left).category === EssentialTypes.CHAR) {
160
+ otherType = S10_EssentialTypePass.getExprEssentialType($startNode.right);
161
+ }
162
+ else if (S10_EssentialTypePass.getExprEssentialType($startNode.right).category === EssentialTypes.CHAR) {
163
+ otherType = S10_EssentialTypePass.getExprEssentialType($startNode.left);
164
+ }
165
+ if (otherType && !S10_EssentialTypePass.isInteger(otherType.category)) {
166
+ this.logMISRAError(`One operand of addition ${$startNode.code} has essentially character type, so the other one must have either essentially signed or unsigned type.`);
167
+ return;
168
+ }
169
+ }
170
+ else if ($startNode.kind === "sub") {
171
+ if (S10_EssentialTypePass.getExprEssentialType($startNode.left).category === EssentialTypes.CHAR) {
172
+ const rightType = S10_EssentialTypePass.getExprEssentialType($startNode.right);
173
+ if (!([EssentialTypes.CHAR, EssentialTypes.SIGNED, EssentialTypes.UNKOWN].some(et => et === rightType.category))) {
174
+ this.logMISRAError(`Left operand of subtraction ${$startNode.code} has essentially character type, so the RHS must be essentially signed, unsigned, or char.`);
175
+ return;
176
+ }
177
+ }
178
+ else if (S10_EssentialTypePass.getExprEssentialType($startNode.right).category === EssentialTypes.CHAR) {
179
+ this.logMISRAError(`Right operand of subtraction ${$startNode.code} can only be of essentially character type if the LHS is too.`);
180
+ return;
181
+ }
182
+ }
183
+ }
184
+ static isAssignable($t1, $t2, $rhs) {
185
+ if ($t1.category === EssentialTypes.UNSIGNED && $rhs instanceof IntLiteral) {
186
+ return true;
187
+ }
188
+ else if ($t1.category !== $t2.category) {
189
+ return false;
190
+ }
191
+ else if ($t1.category === EssentialTypes.ENUM && $t1.enumName === $t2.enumName) {
192
+ return false;
193
+ }
194
+ else
195
+ return true;
196
+ }
197
+ r10_3_noInvalidAssignments($startNode) {
198
+ if ($startNode instanceof BinaryOp && $startNode.kind === "assign") {
199
+ if (!S10_EssentialTypePass.isAssignable(S10_EssentialTypePass.getExprEssentialType($startNode.left), S10_EssentialTypePass.getExprEssentialType($startNode.right), $startNode.right)) {
200
+ this.logMISRAError(`Value ${$startNode.right.code} cannot be assigned to ${$startNode.left.code}, since it has a different essential type category.`);
201
+ }
202
+ else if ($startNode.left.bitWidth < $startNode.right.bitWidth) {
203
+ this.logMISRAError(`Value ${$startNode.right.code} cannot be assigned to ${$startNode.left.code} since it has a narrower type.`);
204
+ }
205
+ }
206
+ else if ($startNode instanceof Vardecl && $startNode.hasInit) {
207
+ if (!S10_EssentialTypePass.isAssignable(S10_EssentialTypePass.getEssentialType($startNode.type), S10_EssentialTypePass.getExprEssentialType($startNode.init), $startNode.init)) {
208
+ this.logMISRAError(`Value ${$startNode.init.code} cannot be initialized in ${$startNode.code}, since it has a different essential type category.`);
209
+ }
210
+ else if ($startNode.bitWidth < $startNode.init.bitWidth) {
211
+ this.logMISRAError(`Value ${$startNode.init.code} cannot be initialized im ${$startNode.code} since it has a narrower type.`);
212
+ }
213
+ }
214
+ else if ($startNode instanceof ReturnStmt && $startNode.returnExpr) {
215
+ const fun = $startNode.getAncestor("function");
216
+ if (!S10_EssentialTypePass.isAssignable(S10_EssentialTypePass.getExprEssentialType($startNode.returnExpr), S10_EssentialTypePass.getEssentialType(fun.returnType), $startNode.returnExpr)) {
217
+ this.logMISRAError(`Value ${$startNode.returnExpr.code} cannot be returned by ${fun.signature}, since it has a different essential type category.`);
218
+ }
219
+ else if (fun.bitWidth < $startNode.returnExpr.bitWidth) {
220
+ this.logMISRAError(`Value ${$startNode.returnExpr.code} cannot be returned by ${fun.signature} since it has a narrower type.`);
221
+ }
222
+ }
223
+ else if ($startNode instanceof Call) {
224
+ const funParams = $startNode.directCallee.params;
225
+ for (let i = 0; i < funParams.length; i++) {
226
+ if (!S10_EssentialTypePass.isAssignable(S10_EssentialTypePass.getEssentialType(funParams[i].type), S10_EssentialTypePass.getEssentialType($startNode.argList[i].type), $startNode.argList[i])) {
227
+ this.logMISRAError(`Value ${$startNode.argList[i].code} cannot be assigned to parameter ${funParams[i].code}, since it has a different essential type category.`);
228
+ }
229
+ else if (funParams[i].bitWidth < $startNode.argList[i].bitWidth) {
230
+ this.logMISRAError(`Value ${$startNode.argList[i].code} cannot be assigned to parameter ${funParams[i].code}, since it has a narrower type.`);
231
+ }
232
+ }
233
+ }
234
+ }
235
+ static checkBoolSource(subExpr) {
236
+ if (S10_EssentialTypePass.getExprEssentialType(subExpr).category === EssentialTypes.BOOL) {
237
+ return true;
238
+ }
239
+ else if (subExpr instanceof IntLiteral && (Number(subExpr.value) === 0 || Number(subExpr.value) === 1)) {
240
+ return true;
241
+ }
242
+ else
243
+ return false;
244
+ }
245
+ r10_5_noInvalidCasts($startNode) {
246
+ if (!($startNode instanceof Cast))
247
+ return;
248
+ const subExpr = $startNode.subExpr;
249
+ const toType = $startNode.toType.desugarAll;
250
+ const toEssentialType = S10_EssentialTypePass.getEssentialType(toType);
251
+ const fromEssentialType = S10_EssentialTypePass.getExprEssentialType(subExpr);
252
+ if (toEssentialType.category === EssentialTypes.BOOL && !S10_EssentialTypePass.checkBoolSource($startNode.subExpr)) {
253
+ this.logMISRAError("Only essentially boolean values, or the integer constants 0 or 1, may be cast to an essentially boolean type.");
254
+ }
255
+ else if ((toEssentialType.category === EssentialTypes.ENUM && fromEssentialType.category === EssentialTypes.ENUM && toEssentialType.enumName !== fromEssentialType.enumName)
256
+ || (toEssentialType.category === EssentialTypes.ENUM && fromEssentialType.category !== EssentialTypes.ENUM)) {
257
+ this.logMISRAError("Only essentially enum values of the same enum may be cast to an essentially enum type.");
258
+ }
259
+ else if (toEssentialType.category === EssentialTypes.SIGNED && fromEssentialType.category === EssentialTypes.BOOL) {
260
+ this.logMISRAError("Essentially boolean values should not be cast to an essentially signed type.");
261
+ }
262
+ else if (toEssentialType.category === EssentialTypes.UNSIGNED && fromEssentialType.category === EssentialTypes.BOOL) {
263
+ this.logMISRAError("Essentially boolean values should not be cast to an essentially unsigned type.");
264
+ }
265
+ else if (toEssentialType.category === EssentialTypes.FLOAT && fromEssentialType.category === EssentialTypes.BOOL) {
266
+ this.logMISRAError("Essentially boolean values should not be cast to an essentially floating type.");
267
+ }
268
+ }
269
+ static isCompositeBinaryExpr($op) {
270
+ return /(add)|(sub)|(mul)|(div)|(rem)|(shl)|(shr)|(l_and)|(l_or)|(xor)/.test($op.kind);
271
+ }
272
+ static isCompositeExpr($expr) {
273
+ if ($expr instanceof ParenExpr) {
274
+ return this.isCompositeExpr($expr.subExpr);
275
+ }
276
+ else if ($expr instanceof BinaryOp) {
277
+ if (this.isCompositeBinaryExpr($expr)) {
278
+ return $expr;
279
+ }
280
+ }
281
+ else if ($expr instanceof TernaryOp) {
282
+ if (this.isCompositeExpr($expr.trueExpr) || this.isCompositeExpr($expr.falseExpr)) {
283
+ return $expr;
284
+ }
285
+ }
286
+ else
287
+ return undefined;
288
+ }
289
+ static compositeExprWidth($op) {
290
+ if ($op instanceof BinaryOp && S10_EssentialTypePass.isCompositeBinaryExpr($op)) {
291
+ const leftW = S10_EssentialTypePass.compositeExprWidth($op.left);
292
+ const rightW = S10_EssentialTypePass.compositeExprWidth($op.right);
293
+ return Math.max(leftW, rightW);
294
+ }
295
+ else if ($op instanceof TernaryOp) {
296
+ const secondW = S10_EssentialTypePass.compositeExprWidth($op.trueExpr);
297
+ const thirdW = S10_EssentialTypePass.compositeExprWidth($op.falseExpr);
298
+ return Math.min(secondW, thirdW);
299
+ }
300
+ else if ($op instanceof ParenExpr) {
301
+ return this.compositeExprWidth($op.subExpr);
302
+ }
303
+ else
304
+ return $op.bitWidth;
305
+ }
306
+ static transformBinaryOp($expr, $type) {
307
+ $expr.left.replaceWith(ClavaJoinPoints.cStyleCast($type, $expr.left));
308
+ }
309
+ static transformTernaryOp($expr, $type, $bitWidth) {
310
+ const trueExpr = this.isCompositeExpr($expr.trueExpr);
311
+ const falseExpr = this.isCompositeExpr($expr.falseExpr);
312
+ if (trueExpr && this.compositeExprWidth(trueExpr) < $bitWidth) {
313
+ if (trueExpr instanceof TernaryOp)
314
+ this.transformTernaryOp(trueExpr, $type, $bitWidth);
315
+ else if (trueExpr instanceof BinaryOp)
316
+ this.transformBinaryOp(trueExpr, $type);
317
+ }
318
+ if (falseExpr && this.compositeExprWidth(falseExpr) < $type.bitWidth) {
319
+ if (falseExpr instanceof TernaryOp)
320
+ this.transformTernaryOp(falseExpr, $type, $bitWidth);
321
+ else if (falseExpr instanceof BinaryOp)
322
+ this.transformBinaryOp(falseExpr, $type);
323
+ }
324
+ }
325
+ r10_6_noWiderCompositeExprAssignments($startNode) {
326
+ if (!($startNode instanceof Expression))
327
+ return;
328
+ const compositeExpr = S10_EssentialTypePass.isCompositeExpr($startNode);
329
+ if (compositeExpr) {
330
+ const parent = $startNode.parent;
331
+ if (parent instanceof BinaryOp && parent.kind === "assign") {
332
+ if (S10_EssentialTypePass.compositeExprWidth(compositeExpr) < parent.left.bitWidth) {
333
+ this.logMISRAError("A composite expression must not be assigned to a value with wider type.", new Fix(compositeExpr, op => {
334
+ if (op instanceof BinaryOp) {
335
+ S10_EssentialTypePass.transformBinaryOp(op, op.parent.type);
336
+ }
337
+ else if (op instanceof TernaryOp) {
338
+ op.replaceWith(ClavaJoinPoints.cStyleCast(op.parent.type, op));
339
+ }
340
+ }));
341
+ }
342
+ }
343
+ }
344
+ }
345
+ r10_8_noWiderCompositeCasts($startNode) {
346
+ if (!($startNode instanceof Cast))
347
+ return;
348
+ const compositeExpr = S10_EssentialTypePass.isCompositeExpr($startNode.subExpr);
349
+ if (compositeExpr) {
350
+ if (S10_EssentialTypePass.getEssentialType($startNode.fromType).category !== S10_EssentialTypePass.getEssentialType($startNode.toType).category) {
351
+ this.logMISRAError(`Composite expression ${$startNode.subExpr.code} cannot be cast to ${$startNode.toType.code}, since it has a different essential type category.`);
352
+ }
353
+ else if ($startNode.bitWidth > S10_EssentialTypePass.compositeExprWidth(compositeExpr)) {
354
+ this.logMISRAError(`Composite expression ${$startNode.subExpr.code} cannot be cast to ${$startNode.toType.code} since it is a wider type.`, new Fix($startNode, cast => {
355
+ const castJp = cast;
356
+ const compositeExpr = S10_EssentialTypePass.isCompositeExpr(castJp.subExpr);
357
+ if (compositeExpr instanceof BinaryOp) {
358
+ compositeExpr.left.replaceWith(ClavaJoinPoints.cStyleCast(cast.type, compositeExpr.left));
359
+ cast.replaceWith(compositeExpr);
360
+ }
361
+ else if (compositeExpr instanceof TernaryOp) {
362
+ S10_EssentialTypePass.transformTernaryOp(compositeExpr, cast.type, cast.bitWidth);
363
+ }
364
+ }));
365
+ }
366
+ }
367
+ }
368
+ _name = "Essential type model";
369
+ }
370
+ //# sourceMappingURL=S10_EssentialTypePass.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"S10_EssentialTypePass.js","sourceRoot":"","sources":["../../../src/misra/passes/S10_EssentialTypePass.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { LaraJoinPoint } from "@specs-feup/lara/api/LaraJoinPoint.js";
2
+ import MISRAPass from "../MISRAPass.js";
3
+ import { PreprocessingReqs } from "../MISRAReporter.js";
4
+ export default class S12_ExpressionPass extends MISRAPass {
5
+ protected _preprocessingReqs: PreprocessingReqs[];
6
+ initRuleMapper(): void;
7
+ matchJoinpoint($jp: LaraJoinPoint): boolean;
8
+ private static isAdditive;
9
+ private static isMultiplicative;
10
+ private static isShift;
11
+ private static isRelational;
12
+ private static isEquality;
13
+ private static isSamePrecedence;
14
+ private r12_1_explicitPrecedence;
15
+ private r12_3_noCommaOperator;
16
+ protected _name: string;
17
+ }
18
+ //# sourceMappingURL=S12_ExpressionPass.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"S12_ExpressionPass.d.ts","sourceRoot":"","sources":["../../../src/misra/passes/S12_ExpressionPass.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AACtE,OAAO,SAAS,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAKxD,MAAM,CAAC,OAAO,OAAO,kBAAmB,SAAQ,SAAS;IACrD,SAAS,CAAC,kBAAkB,EAAE,iBAAiB,EAAE,CAAM;IAEvD,cAAc,IAAI,IAAI;IAMtB,cAAc,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO;IAI3C,OAAO,CAAC,MAAM,CAAC,UAAU;IAIzB,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAI/B,OAAO,CAAC,MAAM,CAAC,OAAO;IAItB,OAAO,CAAC,MAAM,CAAC,YAAY;IAI3B,OAAO,CAAC,MAAM,CAAC,UAAU;IAIzB,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAY/B,OAAO,CAAC,wBAAwB;IAehC,OAAO,CAAC,qBAAqB;IAgB7B,SAAS,CAAC,KAAK,EAAE,MAAM,CAAiB;CAE3C"}
@@ -0,0 +1,72 @@
1
+ import MISRAPass from "../MISRAPass.js";
2
+ import { BinaryOp, Loop, Op } from "@specs-feup/clava/api/Joinpoints.js";
3
+ import Fix from "@specs-feup/clava/api/clava/analysis/Fix.js";
4
+ import ClavaJoinPoints from "@specs-feup/clava/api/clava/ClavaJoinPoints.js";
5
+ export default class S12_ExpressionPass extends MISRAPass {
6
+ _preprocessingReqs = [];
7
+ initRuleMapper() {
8
+ this._ruleMapper = new Map([
9
+ [1, this.r12_1_explicitPrecedence.bind(this)],
10
+ [3, this.r12_3_noCommaOperator.bind(this)]
11
+ ]);
12
+ }
13
+ matchJoinpoint($jp) {
14
+ return $jp instanceof BinaryOp && !$jp.isAssignment;
15
+ }
16
+ static isAdditive(op) {
17
+ return op === "add" || op === "sub";
18
+ }
19
+ static isMultiplicative(op) {
20
+ return op === "mul" || op === "div" || op === "rem";
21
+ }
22
+ static isShift(op) {
23
+ return op === "shl" || op === "shr";
24
+ }
25
+ static isRelational(op) {
26
+ return op === "lt" || op === "gt" || op === "le" || op === "ge";
27
+ }
28
+ static isEquality(op) {
29
+ return op === "eq" || op === "ne";
30
+ }
31
+ static isSamePrecedence(op1, op2) {
32
+ if (op1 === op2)
33
+ return true;
34
+ for (const fun of [this.isAdditive, this.isMultiplicative, this.isShift, this.isRelational, this.isEquality]) {
35
+ if (fun(op1) && fun(op2)) {
36
+ return true;
37
+ }
38
+ }
39
+ return false;
40
+ }
41
+ r12_1_explicitPrecedence($startNode) {
42
+ if (!($startNode instanceof BinaryOp))
43
+ return;
44
+ if (($startNode.kind === "ptr_mem_d" || $startNode.kind === "ptr_mem_i")
45
+ || (!$startNode.getAncestor("binaryOp") && !$startNode.getAncestor("ternaryOp"))
46
+ || ($startNode.parent instanceof BinaryOp && $startNode.parent.isAssignment)
47
+ || ($startNode.parent instanceof Op && S12_ExpressionPass.isSamePrecedence($startNode.kind, $startNode.parent.kind))
48
+ || ($startNode.parent.instanceOf("parenExpr")))
49
+ return;
50
+ this.logMISRAError(`Operator precedence in expression ${$startNode.code} is not explicit.`, new Fix($startNode, ($jp) => {
51
+ const parenExpr = ClavaJoinPoints.parenthesis($jp);
52
+ $jp.replaceWith(parenExpr);
53
+ }));
54
+ }
55
+ r12_3_noCommaOperator($startNode) {
56
+ if (!($startNode instanceof BinaryOp && $startNode.operator === ","))
57
+ return;
58
+ const loopAncestor = $startNode.getAncestor("loop");
59
+ if (loopAncestor instanceof Loop && (loopAncestor?.step?.contains($startNode) || loopAncestor?.cond?.contains($startNode) || loopAncestor?.init?.contains($startNode))) {
60
+ console.log(`Cannot eliminate comma operator in expression ${$startNode.code} since it is at the head of a loop.`);
61
+ this.logMISRAError("Use of the comma operator is not allowed.");
62
+ }
63
+ else {
64
+ this.logMISRAError("Use of the comma operator is not allowed.", new Fix($startNode, ($jp) => {
65
+ $jp.insertBefore($jp.left.stmt);
66
+ $jp.replaceWith($jp.right);
67
+ }));
68
+ }
69
+ }
70
+ _name = "Expressions";
71
+ }
72
+ //# sourceMappingURL=S12_ExpressionPass.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"S12_ExpressionPass.js","sourceRoot":"","sources":["../../../src/misra/passes/S12_ExpressionPass.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { LaraJoinPoint } from "@specs-feup/lara/api/LaraJoinPoint.js";
2
+ import MISRAPass from "../MISRAPass.js";
3
+ import { PreprocessingReqs } from "../MISRAReporter.js";
4
+ export default class S13_SideEffectPass extends MISRAPass {
5
+ protected _preprocessingReqs: PreprocessingReqs[];
6
+ initRuleMapper(): void;
7
+ matchJoinpoint($jp: LaraJoinPoint): boolean;
8
+ private checkPotentialPersistentSideEffects;
9
+ private r13_1_initListSideEffects;
10
+ private static visitAllExprs;
11
+ private checkIncrementSideEffects;
12
+ private r13_3_noIncrementSideEffects;
13
+ private r13_4_noUseOfAssignmentValue;
14
+ private r13_5_shortCircuitSideEffects;
15
+ private r13_6_sizeofSideEffects;
16
+ protected _name: string;
17
+ }
18
+ //# sourceMappingURL=S13_SideEffectPass.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"S13_SideEffectPass.d.ts","sourceRoot":"","sources":["../../../src/misra/passes/S13_SideEffectPass.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,uCAAuC,CAAC;AACtE,OAAO,SAAS,MAAM,iBAAiB,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAMxD,MAAM,CAAC,OAAO,OAAO,kBAAmB,SAAQ,SAAS;IACrD,SAAS,CAAC,kBAAkB,EAAE,iBAAiB,EAAE,CAAM;IAEvD,cAAc,IAAI,IAAI;IAUtB,cAAc,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO;IAI3C,OAAO,CAAC,mCAAmC;IAkB3C,OAAO,CAAC,yBAAyB;IAMjC,OAAO,CAAC,MAAM,CAAC,aAAa;IAa5B,OAAO,CAAC,yBAAyB;IA2BjC,OAAO,CAAC,4BAA4B;IAQpC,OAAO,CAAC,4BAA4B;IAQpC,OAAO,CAAC,6BAA6B;IAMrC,OAAO,CAAC,uBAAuB;IAO/B,SAAS,CAAC,KAAK,EAAE,MAAM,CAAkB;CAE5C"}