@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,49 @@
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 test1() {
7
+ int x = 0;
8
+ goto label1;
9
+
10
+ label1:
11
+ x++;
12
+
13
+ return 0;
14
+ }`;
15
+
16
+ const failingCode = `
17
+ int test2() {
18
+ int x = 0;
19
+ label1:
20
+ x = 1;
21
+ label2:
22
+ x++;
23
+
24
+ goto label3;
25
+
26
+ label3:
27
+ x += 4;
28
+ return 0;
29
+ }`;
30
+
31
+ const files: TestFile[] = [
32
+ { name: "bad.c", code: failingCode },
33
+ { name: "good.c", code: passingCode }
34
+ ];
35
+
36
+ describe("Rule 2.6", () => {
37
+ registerSourceCode(files);
38
+
39
+ it("should detect errors in bad.c", () => {
40
+ expect(countMISRAErrors()).toBe(2);
41
+
42
+ expect(countMISRAErrors(Query.search(FileJp, {name: "bad.c"}).first()!)).toBe(2);
43
+ expect(countMISRAErrors(Query.search(FileJp, {name: "good.c"}).first()!)).toBe(0);
44
+ });
45
+
46
+ it("should correct errors in bad.c", () => {
47
+ expect(countErrorsAfterCorrection()).toBe(0);
48
+ });
49
+ });
@@ -0,0 +1,55 @@
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 failingCode = `
6
+ int foo(int x, int y, int z);
7
+
8
+ int foo(int x, int y, int z) {
9
+ y++;
10
+ return y;
11
+ }
12
+
13
+ int main() {
14
+ int a = 5, b = 10, c = 15;
15
+ int result1 = foo(a, b, c);
16
+
17
+ int result2 = result1 + foo(a, b, c);
18
+
19
+ return result2;
20
+ }`;
21
+
22
+ const passingCode = `
23
+ extern int foo(int x, int y, int z);
24
+
25
+ int my_func(int x, int y, int z) {
26
+ return x + y + z;
27
+ }
28
+
29
+ int my_func2() {
30
+ return 0;
31
+ }
32
+
33
+ int bar() {
34
+ return my_func(1, 2, 3) + foo(50, 51, 52);
35
+ }`;
36
+
37
+ const files: TestFile[] = [
38
+ { name: "bad.c", code: failingCode },
39
+ { name: "good.c", code: passingCode }
40
+ ];
41
+
42
+ describe("Rule 2.7", () => {
43
+ registerSourceCode(files);
44
+
45
+ it("should detect errors in bad.c", () => {
46
+ expect(countMISRAErrors()).toBe(2);
47
+
48
+ expect(countMISRAErrors(Query.search(FileJp, {name: "bad.c"}).first()!)).toBe(2);
49
+ expect(countMISRAErrors(Query.search(FileJp, {name: "good.c"}).first()!)).toBe(0);
50
+ });
51
+
52
+ it("should correct errors in bad.c", () => {
53
+ expect(countErrorsAfterCorrection()).toBe(0);
54
+ });
55
+ });
@@ -0,0 +1,37 @@
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 = `int main() {
6
+ int x, y, z;// good inline comment
7
+ // good */ comment
8
+ return 0;
9
+ }`;
10
+
11
+ const failingCode = `int test() {
12
+ int x, y, z; // bad inl/*ine comment
13
+
14
+ /* bad /* block comment */
15
+
16
+ return 0;
17
+ }`;
18
+
19
+ const files: TestFile[] = [
20
+ { name: "bad.c", code: failingCode },
21
+ { name: "good.c", code: passingCode }
22
+ ];
23
+
24
+ describe("Rule 3.1", () => {
25
+ registerSourceCode(files);
26
+
27
+ it("should detect errors in bad.c", () => {
28
+ expect(countMISRAErrors()).toBe(2);
29
+
30
+ expect(countMISRAErrors(Query.search(FileJp, {name: "bad.c"}).first()!)).toBe(2);
31
+ expect(countMISRAErrors(Query.search(FileJp, {name: "good.c"}).first()!)).toBe(0);
32
+ });
33
+
34
+ it("should correct errors in bad.c", () => {
35
+ expect(countErrorsAfterCorrection()).toBe(0);
36
+ });
37
+ });
@@ -0,0 +1,51 @@
1
+ import MISRATool from "../MISRATool.js";
2
+ import Clava from "@specs-feup/clava/api/clava/Clava.js";
3
+ import ClavaJoinPoints from "@specs-feup/clava/api/clava/ClavaJoinPoints.js";
4
+ import { FileJp, Program } from "@specs-feup/clava/api/Joinpoints.js";
5
+ import Query from "@specs-feup/lara/api/weaver/Query.js";
6
+ import * as os from 'os';
7
+
8
+ export function countMISRAErrors(startingPoint: FileJp | Program = Query.root() as Program): number {
9
+ MISRATool.checkCompliance(startingPoint);
10
+ return MISRATool.getErrorCount();
11
+ }
12
+
13
+ export function countErrorsAfterCorrection(configPath?: string): number {
14
+ MISRATool.applyCorrections(configPath);
15
+ return MISRATool.getActiveErrorCount();
16
+ }
17
+
18
+ export interface TestFile {
19
+ name: string,
20
+ code: string
21
+ path?: string
22
+ }
23
+
24
+ export function registerSourceCode(files: TestFile[]): void {
25
+ beforeEach(() => {
26
+ const dataStore = Clava.getData();
27
+
28
+ dataStore.setStandard(process.env.STD_VERSION!);
29
+
30
+ // If running on macOS, change libcCxxMode
31
+ if (os.platform() === 'darwin') {
32
+ const key = "libcCxxMode";
33
+ const allowedValues = dataStore.getType(key).getEnumConstants();
34
+ const systemValue = allowedValues.find((value: any) => value.name() === "SYSTEM");
35
+ dataStore.put(key, systemValue);
36
+ }
37
+
38
+ Clava.getProgram().push();
39
+ const program = Clava.getProgram();
40
+ files.forEach(file => {
41
+ const sourceFile = ClavaJoinPoints.fileWithSource(file.name, file.code, file.path);
42
+ program.addFile(sourceFile);
43
+ });
44
+ program.rebuild();
45
+ });
46
+
47
+ afterEach(() => {
48
+ Clava.getProgram().rebuild();
49
+ Clava.getProgram().pop();
50
+ });
51
+ }
@@ -0,0 +1,280 @@
1
+ import Query from "@specs-feup/lara/api/weaver/Query.js";
2
+ import { Comment, Type, Case, Joinpoint, ArrayType, TypedefDecl, DeclStmt, TypedefNameDecl, StorageClass, FunctionJp, Vardecl, FileJp, RecordJp, EnumDecl, PointerType, Switch, BuiltinType, BinaryOp, Break, Scope, Statement, Expression, WrapperStmt, ElaboratedType, TagType, Param, Varref, Program, Include, Call } from "@specs-feup/clava/api/Joinpoints.js";
3
+ import ClavaJoinPoints from "@specs-feup/clava/api/clava/ClavaJoinPoints.js";
4
+
5
+ /**
6
+ * Checks if the comment is an inline comment
7
+ * @param $comment - The comment to check
8
+ * @returns Returns true if it's an inline comment, otherwise returns false
9
+ */
10
+ export function isInlineComment($comment: Comment): boolean {
11
+ return $comment.astName === "InlineComment";
12
+ }
13
+
14
+ /**
15
+ * Retrieves all comments associated with a given joinpoint
16
+ * @param $jp - The joinpoint to retrieve comments from
17
+ * @returns Array of comments
18
+ */
19
+ export function getComments($jp: Joinpoint): Comment[] {
20
+ return $jp instanceof Comment ? [$jp] : $jp.inlineComments;
21
+ }
22
+
23
+ /**
24
+ * Checks if a given join point is a comment statement
25
+ *
26
+ * @param $jp The join point to check
27
+ * @returns Returns true if the given join point is a comment statement, otherwise false
28
+ */
29
+ export function isCommentStmt($jp: Joinpoint): boolean {
30
+ return $jp instanceof WrapperStmt && $jp.kind === "comment";
31
+ }
32
+
33
+ export function getParamReferences($param: Param, $startingPoint: Joinpoint): Varref[] {
34
+ return Query.searchFrom($startingPoint, Varref, (ref) => {
35
+ try {
36
+ return ref.decl && ref.decl.astId === $param.astId;
37
+ } catch (error) {
38
+ return false;
39
+ }
40
+ }).get();
41
+ }
42
+
43
+ /**
44
+ * Checks if a storage class has external linkage
45
+ * @param $class - The storage class to check
46
+ * @returns Returns true if the class has external linkage, otherwise returns false
47
+ */
48
+ export function hasExternalLinkage($class: StorageClass) {
49
+ return $class !== StorageClass.STATIC && $class !== StorageClass.EXTERN;
50
+ }
51
+
52
+ /**
53
+ * Retrieves all variables and functions that can be externed from the files, i.e.,
54
+ * elements with storage classes that are not `STATIC` or `EXTERN`
55
+ * @returns Array of functions and variables that can be externed
56
+ */
57
+ export function getExternals(): (FunctionJp | Vardecl)[] {
58
+ let result: (FunctionJp | Vardecl)[] = [];
59
+
60
+ for (const file of Query.search(FileJp).get()) {
61
+ for(const child of file.children) {
62
+ if((child instanceof Vardecl || child instanceof FunctionJp) && hasExternalLinkage(child.storageClass)) {
63
+ result.push(child);
64
+ }
65
+ }
66
+ }
67
+ return result;
68
+ }
69
+
70
+ /**
71
+ * Checks if the provided node has a defined type
72
+ * @param $jp The joinpoint to check its type
73
+ * @returns true if the joinpoint has a defined type, otherwise false
74
+ */
75
+ export function hasDefinedType($jp: Joinpoint): boolean {
76
+ return $jp.hasType && $jp.type !== null && $jp.type !== undefined;
77
+ }
78
+
79
+ /**
80
+ * Retrieves the base type of the provided joinpoint.
81
+ * @param $jp The joinpoint to retrieve its type
82
+ * @returns The base type of the joinpoint, or undefined if the joinpoint does not have a type
83
+ */
84
+ export function getBaseType($jp: Joinpoint): Type | undefined {
85
+ if (!hasDefinedType($jp)) return undefined;
86
+ let jpType = $jp.type;
87
+
88
+ while (jpType instanceof PointerType || jpType instanceof ArrayType) {
89
+ jpType = jpType instanceof PointerType ? jpType.pointee : jpType.elementType;
90
+ }
91
+ return jpType;
92
+ }
93
+
94
+ /**
95
+ * Retrieves the typedef declaration for the provided joinpoint, if available
96
+ * @param $jp The joinpoint to analyze
97
+ * @returns The typedef declaration if found, or undefined if not
98
+ */
99
+ export function getTypeDecl($jp: Joinpoint): TypedefDecl | undefined {
100
+ if ($jp instanceof DeclStmt && $jp.children.length === 1 && $jp.children[0] instanceof TypedefDecl)
101
+ return $jp.children[0];
102
+
103
+ if ($jp instanceof RecordJp || $jp instanceof EnumDecl) {
104
+ const typeDecls = Query.searchFrom($jp, TypedefDecl).get();
105
+ if (typeDecls.length === 1)
106
+ return typeDecls[0];
107
+ }
108
+ }
109
+
110
+ /**
111
+ * Checks if the provided joinpoint declares a type (typedef)
112
+ * @param $jp The joinpoint to check
113
+ * @returns Returns true if the joinpoint declares a typedef, otherwise false
114
+ */
115
+ export function hasTypeDecl($jp: Joinpoint): boolean {
116
+ return getTypeDecl($jp) !== undefined;
117
+ }
118
+
119
+ /**
120
+ * Retrieves all joinpoints with a defined type
121
+ * @returns Array of joinpoints with a defined type
122
+ */
123
+ export function getTypedJps(startingPoint?: Joinpoint): Joinpoint[] {
124
+ if (startingPoint) {
125
+ return Query.searchFrom(startingPoint, Joinpoint, (jp) => hasDefinedType(jp)).get();
126
+ }
127
+ return Query.search(Joinpoint, (jp) => hasDefinedType(jp)).get();
128
+ }
129
+
130
+ /**
131
+ * Checks if a given joinpoint uses the specified tag declaration
132
+ * @param $jp The joinpoint to analyze
133
+ * @param tag The tag to check against
134
+ * @returns Returns true if the joinpoint uses the given tag, false otherwise
135
+ */
136
+ export function isTagUsed($jp: Joinpoint, tag: RecordJp | EnumDecl): boolean {
137
+ const jpType = getBaseType($jp);
138
+ return jpType instanceof ElaboratedType &&
139
+ jpType.namedType instanceof TagType &&
140
+ jpType.namedType.decl.astId === tag.astId &&
141
+ $jp.astId !== getTypeDecl(tag)?.astId
142
+ }
143
+
144
+ /**
145
+ * Retrieves all joinpoints that use the specified tag declaration
146
+ *
147
+ * @param tag The tag to search for in the joinpoints
148
+ * @returns Array of joinpoints that use the specified tag declaration
149
+ */
150
+ export function getTagUses(tag: RecordJp | EnumDecl): Joinpoint[] {
151
+ return getTypedJps().filter(jp => isTagUsed(jp, tag));
152
+ }
153
+
154
+ /**
155
+ * Retrieves the last statement of the given case
156
+ * @param $jp - The case to retrieve the last statement from
157
+ * @returns The last statement of the case or undefined if there are no statements or it has a consecutive case.
158
+ */
159
+ export function getLastStmtOfCase($jp: Case): Joinpoint | undefined {
160
+ if ($jp.instructions.length === 0) { // Has a consecutive case
161
+ return undefined;
162
+ }
163
+
164
+ let lastStmt: Joinpoint | undefined;
165
+ for (const stmt of $jp.siblingsRight) {
166
+ if (stmt instanceof Case) {
167
+ break;
168
+ }
169
+ lastStmt = stmt;
170
+ }
171
+ return lastStmt;
172
+ }
173
+
174
+ /**
175
+ * Retrieves the number of switch clauses with instructions in the provided switch statement
176
+ * @param $jp - The switch statement to analyze
177
+ * @returns The number of switch clauses with instructions
178
+ */
179
+ export function getNumOfSwitchClauses($jp: Switch): number {
180
+ let firstStatements = []
181
+
182
+ for (const caseLabel of $jp.cases) {
183
+ if (caseLabel.instructions.length === 0) { // Has a consecutive case
184
+ continue;
185
+ }
186
+ firstStatements.push(caseLabel.instructions[0])
187
+ }
188
+ return firstStatements.length;
189
+ }
190
+
191
+ /**
192
+ * Checks if the provided switch statement has a Boolean condition
193
+ * @param switchStmt The switch statement to check
194
+ * @returns Returns true if the switch statement has a Boolean condition, otherwise false
195
+ */
196
+ export function switchHasBooleanCondition(switchStmt: Switch): boolean {
197
+ return switchStmt.condition instanceof BinaryOp ||
198
+ (hasDefinedType(switchStmt.condition) &&
199
+ switchStmt.condition.type instanceof BuiltinType &&
200
+ switchStmt.condition.type.builtinKind === "Bool"
201
+ );
202
+ }
203
+
204
+ /**
205
+ * Checks if the provided switch statement contains any conditional break
206
+ *
207
+ * @param switchStmt - The switch statement to analyze
208
+ * @returns Returns true if the switch statement contains a conditional break, otherwise false
209
+ */
210
+ export function switchHasConditionalBreak(switchStmt: Switch): boolean {
211
+ return Query.searchFrom(switchStmt, Break, { currentRegion: region => region.astId !== switchStmt.astId, enclosingStmt: jp => jp.astId === switchStmt.astId }).get().length > 0;
212
+ }
213
+
214
+ /**
215
+ * Checks if a file compiles correctly after adding a statement by rebuilding it.
216
+ * If rebuilding fails, the file is considered invalid with the new statement.
217
+ *
218
+ * @param fileJp - The file to validate.
219
+ */
220
+ export function isValidFile(fileJp: FileJp) : boolean {
221
+ const programJp = fileJp.parent as Program;
222
+ let copyFile = ClavaJoinPoints.fileWithSource(`temp_misra_${fileJp.name}`, fileJp.code, fileJp.relativeFolderpath);
223
+
224
+ copyFile = programJp.addFile(copyFile) as FileJp;
225
+ try {
226
+ const rebuiltFile = copyFile.rebuild();
227
+ const fileToRemove = Query.searchFrom(programJp, FileJp, {filepath: rebuiltFile.filepath}).first();
228
+ fileToRemove?.detach();
229
+ return true;
230
+ } catch(error) {
231
+ copyFile.detach();
232
+ return false;
233
+ }
234
+ }
235
+
236
+ /**
237
+ * Retrieves the list of header files included in the given file
238
+ *
239
+ * @param fileJp The file join point
240
+ * @returns An array of strings with the names of the includes
241
+ */
242
+ export function getIncludesOfFile(fileJp: FileJp): string[] {
243
+ return fileJp.includes.map(includeJp => includeJp.name);
244
+ }
245
+
246
+ /**
247
+ * Removes a specific include directive from the given file, if it exists
248
+ *
249
+ * @param includeName The name of the include to remove
250
+ * @param fileJp The file from which the include should be removed
251
+ */
252
+ export function removeIncludeFromFile(includeName: string, fileJp: FileJp) {
253
+ const include = Query.searchFrom(fileJp, Include, {name: includeName}).first();
254
+ include?.detach();
255
+ }
256
+
257
+ /**
258
+ * Check if the given joinpoint represents a call to an implicit function.
259
+ *
260
+ * @param callJp The call join point to analyze
261
+ */
262
+ export function isCallToImplicitFunction(callJp: Call): boolean {
263
+ return callJp.function.definitionJp === undefined && !callJp.function.isInSystemHeader;
264
+ }
265
+
266
+ /**
267
+ * Returns all files in the program that contain at least one call to an implicit function
268
+ *
269
+ * @param programJp - The program to analyze
270
+ * @returns A list of files with implicit function calls
271
+ */
272
+ export function getFilesWithCallToImplicitFunction(programJp: Program): FileJp[] {
273
+ const files = Query.searchFrom(programJp, FileJp).get();
274
+ return files.filter(
275
+ (fileJp) =>
276
+ Query.searchFrom(fileJp, Call, (callJp) =>
277
+ isCallToImplicitFunction(callJp)
278
+ ).get().length > 0
279
+ );
280
+ }
package/tsconfig.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
- "include": ["src/**/*.ts"],
3
- "exclude": ["node_modules", "**/*.spec.ts", "**/*.test.ts"],
2
+ "include": ["src/**/*.ts", "src/**/*.json"],
3
+ "exclude": ["node_modules", "**/*.spec.ts", "**/*.test.ts", "src/misra-old"],
4
4
  "compilerOptions": {
5
5
  "outDir": "dist",
6
6
  "target": "ES2022",
@@ -12,7 +12,8 @@
12
12
  "moduleResolution": "NodeNext",
13
13
  "sourceMap": true,
14
14
  "declarationMap": true,
15
- "allowSyntheticDefaultImports": true
15
+ "allowSyntheticDefaultImports": true,
16
+ "resolveJsonModule": true
16
17
  //"esModuleInterop": true
17
18
  }
18
19
  }
package/typedoc.config.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { fileURLToPath } from "url";
2
2
 
3
3
  export default {
4
- extends: [ fileURLToPath(import.meta.resolve("lara-js/typedoc.base.json")) ],
4
+ extends: [ fileURLToPath(import.meta.resolve("@specs-feup/lara/typedoc.base.json")) ],
5
5
  entryPoints: ["src/"],
6
6
  }
@@ -1,3 +0,0 @@
1
- #include <stdio.h>
2
-
3
- void foo() { printf("Hello, world!"); }
package/CxxSources/lib.h DELETED
@@ -1,8 +0,0 @@
1
- #ifndef __LIB_H__
2
- #define __LIB_H__
3
-
4
- #include <stdio.h>
5
-
6
- void foo();
7
-
8
- #endif // __LIB_H__
@@ -1,40 +0,0 @@
1
- void f ( void )
2
- {
3
- int x, y, z;
4
- int flag;
5
- switch (x) {
6
- case 1:
7
- z = y+x;
8
- break;
9
- case 2:
10
- z = y-x;
11
- break;
12
- default:
13
- z = 4;
14
- break;
15
- }
16
- switch (flag) {
17
- case 0:
18
- x = 2;
19
- break;
20
- case 1:
21
- x = 4;
22
- break;
23
- case 2:
24
- x = 6;
25
- break;
26
- }
27
- switch (z) {
28
- case 1:
29
- y = 0;
30
- break;
31
- case 6:
32
- case 42:
33
- y = 1;
34
- break;
35
- case 9139:
36
- default:
37
- y = 2;
38
- break;
39
- }
40
- }
package/TODO.md DELETED
@@ -1 +0,0 @@
1
- section 8 has a rule that hasn't been adapted yet
@@ -1,2 +0,0 @@
1
- ASTConsumer built 1
2
- ASTConsumer destroyed 1
File without changes
package/is_temporary.txt DELETED
File without changes
package/omp.txt DELETED
File without changes