NewDelete-path-notes.cpp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494
  1. // RUN: %clang_analyze_cc1 -analyzer-checker=cplusplus.NewDelete,unix.Malloc -analyzer-output=text -verify %s
  2. // RUN: %clang_analyze_cc1 -analyzer-checker=cplusplus.NewDelete,unix.Malloc -analyzer-output=text -analyzer-config c++-allocator-inlining=true -verify %s
  3. // RUN: %clang_analyze_cc1 -analyzer-checker=cplusplus.NewDelete,unix.Malloc -analyzer-output=plist -analyzer-config path-diagnostics-alternate=false %s -o %t.plist
  4. // RUN: FileCheck --input-file=%t.plist %s
  5. void test() {
  6. int *p = new int;
  7. // expected-note@-1 {{Memory is allocated}}
  8. if (p)
  9. // expected-note@-1 {{Taking true branch}}
  10. delete p;
  11. // expected-note@-1 {{Memory is released}}
  12. delete p; // expected-warning {{Attempt to free released memory}}
  13. // expected-note@-1 {{Attempt to free released memory}}
  14. }
  15. struct Odd {
  16. void kill() {
  17. delete this; // expected-note {{Memory is released}}
  18. }
  19. };
  20. void test(Odd *odd) {
  21. odd->kill(); // expected-note{{Calling 'Odd::kill'}}
  22. // expected-note@-1 {{Returning; memory was released}}
  23. delete odd; // expected-warning {{Attempt to free released memory}}
  24. // expected-note@-1 {{Attempt to free released memory}}
  25. }
  26. // CHECK: <key>diagnostics</key>
  27. // CHECK-NEXT: <array>
  28. // CHECK-NEXT: <dict>
  29. // CHECK-NEXT: <key>path</key>
  30. // CHECK-NEXT: <array>
  31. // CHECK-NEXT: <dict>
  32. // CHECK-NEXT: <key>kind</key><string>control</string>
  33. // CHECK-NEXT: <key>edges</key>
  34. // CHECK-NEXT: <array>
  35. // CHECK-NEXT: <dict>
  36. // CHECK-NEXT: <key>start</key>
  37. // CHECK-NEXT: <array>
  38. // CHECK-NEXT: <dict>
  39. // CHECK-NEXT: <key>line</key><integer>7</integer>
  40. // CHECK-NEXT: <key>col</key><integer>3</integer>
  41. // CHECK-NEXT: <key>file</key><integer>0</integer>
  42. // CHECK-NEXT: </dict>
  43. // CHECK-NEXT: <dict>
  44. // CHECK-NEXT: <key>line</key><integer>7</integer>
  45. // CHECK-NEXT: <key>col</key><integer>5</integer>
  46. // CHECK-NEXT: <key>file</key><integer>0</integer>
  47. // CHECK-NEXT: </dict>
  48. // CHECK-NEXT: </array>
  49. // CHECK-NEXT: <key>end</key>
  50. // CHECK-NEXT: <array>
  51. // CHECK-NEXT: <dict>
  52. // CHECK-NEXT: <key>line</key><integer>7</integer>
  53. // CHECK-NEXT: <key>col</key><integer>12</integer>
  54. // CHECK-NEXT: <key>file</key><integer>0</integer>
  55. // CHECK-NEXT: </dict>
  56. // CHECK-NEXT: <dict>
  57. // CHECK-NEXT: <key>line</key><integer>7</integer>
  58. // CHECK-NEXT: <key>col</key><integer>14</integer>
  59. // CHECK-NEXT: <key>file</key><integer>0</integer>
  60. // CHECK-NEXT: </dict>
  61. // CHECK-NEXT: </array>
  62. // CHECK-NEXT: </dict>
  63. // CHECK-NEXT: </array>
  64. // CHECK-NEXT: </dict>
  65. // CHECK-NEXT: <dict>
  66. // CHECK-NEXT: <key>kind</key><string>event</string>
  67. // CHECK-NEXT: <key>location</key>
  68. // CHECK-NEXT: <dict>
  69. // CHECK-NEXT: <key>line</key><integer>7</integer>
  70. // CHECK-NEXT: <key>col</key><integer>12</integer>
  71. // CHECK-NEXT: <key>file</key><integer>0</integer>
  72. // CHECK-NEXT: </dict>
  73. // CHECK-NEXT: <key>ranges</key>
  74. // CHECK-NEXT: <array>
  75. // CHECK-NEXT: <array>
  76. // CHECK-NEXT: <dict>
  77. // CHECK-NEXT: <key>line</key><integer>7</integer>
  78. // CHECK-NEXT: <key>col</key><integer>12</integer>
  79. // CHECK-NEXT: <key>file</key><integer>0</integer>
  80. // CHECK-NEXT: </dict>
  81. // CHECK-NEXT: <dict>
  82. // CHECK-NEXT: <key>line</key><integer>7</integer>
  83. // CHECK-NEXT: <key>col</key><integer>18</integer>
  84. // CHECK-NEXT: <key>file</key><integer>0</integer>
  85. // CHECK-NEXT: </dict>
  86. // CHECK-NEXT: </array>
  87. // CHECK-NEXT: </array>
  88. // CHECK-NEXT: <key>depth</key><integer>0</integer>
  89. // CHECK-NEXT: <key>extended_message</key>
  90. // CHECK-NEXT: <string>Memory is allocated</string>
  91. // CHECK-NEXT: <key>message</key>
  92. // CHECK-NEXT: <string>Memory is allocated</string>
  93. // CHECK-NEXT: </dict>
  94. // CHECK-NEXT: <dict>
  95. // CHECK-NEXT: <key>kind</key><string>control</string>
  96. // CHECK-NEXT: <key>edges</key>
  97. // CHECK-NEXT: <array>
  98. // CHECK-NEXT: <dict>
  99. // CHECK-NEXT: <key>start</key>
  100. // CHECK-NEXT: <array>
  101. // CHECK-NEXT: <dict>
  102. // CHECK-NEXT: <key>line</key><integer>7</integer>
  103. // CHECK-NEXT: <key>col</key><integer>12</integer>
  104. // CHECK-NEXT: <key>file</key><integer>0</integer>
  105. // CHECK-NEXT: </dict>
  106. // CHECK-NEXT: <dict>
  107. // CHECK-NEXT: <key>line</key><integer>7</integer>
  108. // CHECK-NEXT: <key>col</key><integer>14</integer>
  109. // CHECK-NEXT: <key>file</key><integer>0</integer>
  110. // CHECK-NEXT: </dict>
  111. // CHECK-NEXT: </array>
  112. // CHECK-NEXT: <key>end</key>
  113. // CHECK-NEXT: <array>
  114. // CHECK-NEXT: <dict>
  115. // CHECK-NEXT: <key>line</key><integer>9</integer>
  116. // CHECK-NEXT: <key>col</key><integer>3</integer>
  117. // CHECK-NEXT: <key>file</key><integer>0</integer>
  118. // CHECK-NEXT: </dict>
  119. // CHECK-NEXT: <dict>
  120. // CHECK-NEXT: <key>line</key><integer>9</integer>
  121. // CHECK-NEXT: <key>col</key><integer>4</integer>
  122. // CHECK-NEXT: <key>file</key><integer>0</integer>
  123. // CHECK-NEXT: </dict>
  124. // CHECK-NEXT: </array>
  125. // CHECK-NEXT: </dict>
  126. // CHECK-NEXT: </array>
  127. // CHECK-NEXT: </dict>
  128. // CHECK-NEXT: <dict>
  129. // CHECK-NEXT: <key>kind</key><string>control</string>
  130. // CHECK-NEXT: <key>edges</key>
  131. // CHECK-NEXT: <array>
  132. // CHECK-NEXT: <dict>
  133. // CHECK-NEXT: <key>start</key>
  134. // CHECK-NEXT: <array>
  135. // CHECK-NEXT: <dict>
  136. // CHECK-NEXT: <key>line</key><integer>9</integer>
  137. // CHECK-NEXT: <key>col</key><integer>3</integer>
  138. // CHECK-NEXT: <key>file</key><integer>0</integer>
  139. // CHECK-NEXT: </dict>
  140. // CHECK-NEXT: <dict>
  141. // CHECK-NEXT: <key>line</key><integer>9</integer>
  142. // CHECK-NEXT: <key>col</key><integer>4</integer>
  143. // CHECK-NEXT: <key>file</key><integer>0</integer>
  144. // CHECK-NEXT: </dict>
  145. // CHECK-NEXT: </array>
  146. // CHECK-NEXT: <key>end</key>
  147. // CHECK-NEXT: <array>
  148. // CHECK-NEXT: <dict>
  149. // CHECK-NEXT: <key>line</key><integer>11</integer>
  150. // CHECK-NEXT: <key>col</key><integer>5</integer>
  151. // CHECK-NEXT: <key>file</key><integer>0</integer>
  152. // CHECK-NEXT: </dict>
  153. // CHECK-NEXT: <dict>
  154. // CHECK-NEXT: <key>line</key><integer>11</integer>
  155. // CHECK-NEXT: <key>col</key><integer>10</integer>
  156. // CHECK-NEXT: <key>file</key><integer>0</integer>
  157. // CHECK-NEXT: </dict>
  158. // CHECK-NEXT: </array>
  159. // CHECK-NEXT: </dict>
  160. // CHECK-NEXT: </array>
  161. // CHECK-NEXT: </dict>
  162. // CHECK-NEXT: <dict>
  163. // CHECK-NEXT: <key>kind</key><string>event</string>
  164. // CHECK-NEXT: <key>location</key>
  165. // CHECK-NEXT: <dict>
  166. // CHECK-NEXT: <key>line</key><integer>11</integer>
  167. // CHECK-NEXT: <key>col</key><integer>5</integer>
  168. // CHECK-NEXT: <key>file</key><integer>0</integer>
  169. // CHECK-NEXT: </dict>
  170. // CHECK-NEXT: <key>ranges</key>
  171. // CHECK-NEXT: <array>
  172. // CHECK-NEXT: <array>
  173. // CHECK-NEXT: <dict>
  174. // CHECK-NEXT: <key>line</key><integer>11</integer>
  175. // CHECK-NEXT: <key>col</key><integer>5</integer>
  176. // CHECK-NEXT: <key>file</key><integer>0</integer>
  177. // CHECK-NEXT: </dict>
  178. // CHECK-NEXT: <dict>
  179. // CHECK-NEXT: <key>line</key><integer>11</integer>
  180. // CHECK-NEXT: <key>col</key><integer>12</integer>
  181. // CHECK-NEXT: <key>file</key><integer>0</integer>
  182. // CHECK-NEXT: </dict>
  183. // CHECK-NEXT: </array>
  184. // CHECK-NEXT: </array>
  185. // CHECK-NEXT: <key>depth</key><integer>0</integer>
  186. // CHECK-NEXT: <key>extended_message</key>
  187. // CHECK-NEXT: <string>Memory is released</string>
  188. // CHECK-NEXT: <key>message</key>
  189. // CHECK-NEXT: <string>Memory is released</string>
  190. // CHECK-NEXT: </dict>
  191. // CHECK-NEXT: <dict>
  192. // CHECK-NEXT: <key>kind</key><string>control</string>
  193. // CHECK-NEXT: <key>edges</key>
  194. // CHECK-NEXT: <array>
  195. // CHECK-NEXT: <dict>
  196. // CHECK-NEXT: <key>start</key>
  197. // CHECK-NEXT: <array>
  198. // CHECK-NEXT: <dict>
  199. // CHECK-NEXT: <key>line</key><integer>11</integer>
  200. // CHECK-NEXT: <key>col</key><integer>5</integer>
  201. // CHECK-NEXT: <key>file</key><integer>0</integer>
  202. // CHECK-NEXT: </dict>
  203. // CHECK-NEXT: <dict>
  204. // CHECK-NEXT: <key>line</key><integer>11</integer>
  205. // CHECK-NEXT: <key>col</key><integer>10</integer>
  206. // CHECK-NEXT: <key>file</key><integer>0</integer>
  207. // CHECK-NEXT: </dict>
  208. // CHECK-NEXT: </array>
  209. // CHECK-NEXT: <key>end</key>
  210. // CHECK-NEXT: <array>
  211. // CHECK-NEXT: <dict>
  212. // CHECK-NEXT: <key>line</key><integer>14</integer>
  213. // CHECK-NEXT: <key>col</key><integer>3</integer>
  214. // CHECK-NEXT: <key>file</key><integer>0</integer>
  215. // CHECK-NEXT: </dict>
  216. // CHECK-NEXT: <dict>
  217. // CHECK-NEXT: <key>line</key><integer>14</integer>
  218. // CHECK-NEXT: <key>col</key><integer>8</integer>
  219. // CHECK-NEXT: <key>file</key><integer>0</integer>
  220. // CHECK-NEXT: </dict>
  221. // CHECK-NEXT: </array>
  222. // CHECK-NEXT: </dict>
  223. // CHECK-NEXT: </array>
  224. // CHECK-NEXT: </dict>
  225. // CHECK-NEXT: <dict>
  226. // CHECK-NEXT: <key>kind</key><string>event</string>
  227. // CHECK-NEXT: <key>location</key>
  228. // CHECK-NEXT: <dict>
  229. // CHECK-NEXT: <key>line</key><integer>14</integer>
  230. // CHECK-NEXT: <key>col</key><integer>3</integer>
  231. // CHECK-NEXT: <key>file</key><integer>0</integer>
  232. // CHECK-NEXT: </dict>
  233. // CHECK-NEXT: <key>ranges</key>
  234. // CHECK-NEXT: <array>
  235. // CHECK-NEXT: <array>
  236. // CHECK-NEXT: <dict>
  237. // CHECK-NEXT: <key>line</key><integer>14</integer>
  238. // CHECK-NEXT: <key>col</key><integer>3</integer>
  239. // CHECK-NEXT: <key>file</key><integer>0</integer>
  240. // CHECK-NEXT: </dict>
  241. // CHECK-NEXT: <dict>
  242. // CHECK-NEXT: <key>line</key><integer>14</integer>
  243. // CHECK-NEXT: <key>col</key><integer>10</integer>
  244. // CHECK-NEXT: <key>file</key><integer>0</integer>
  245. // CHECK-NEXT: </dict>
  246. // CHECK-NEXT: </array>
  247. // CHECK-NEXT: </array>
  248. // CHECK-NEXT: <key>depth</key><integer>0</integer>
  249. // CHECK-NEXT: <key>extended_message</key>
  250. // CHECK-NEXT: <string>Attempt to free released memory</string>
  251. // CHECK-NEXT: <key>message</key>
  252. // CHECK-NEXT: <string>Attempt to free released memory</string>
  253. // CHECK-NEXT: </dict>
  254. // CHECK-NEXT: </array>
  255. // CHECK-NEXT: <key>description</key><string>Attempt to free released memory</string>
  256. // CHECK-NEXT: <key>category</key><string>Memory error</string>
  257. // CHECK-NEXT: <key>type</key><string>Double free</string>
  258. // CHECK-NEXT: <key>check_name</key><string>cplusplus.NewDelete</string>
  259. // CHECK-NEXT: <!-- This hash is experimental and going to change! -->
  260. // CHECK-NEXT: <key>issue_hash_content_of_line_in_context</key><string>bd8e324d09c70b9e2be6f824a4942e5a</string>
  261. // CHECK-NEXT: <key>issue_context_kind</key><string>function</string>
  262. // CHECK-NEXT: <key>issue_context</key><string>test</string>
  263. // CHECK-NEXT: <key>issue_hash_function_offset</key><string>8</string>
  264. // CHECK-NEXT: <key>location</key>
  265. // CHECK-NEXT: <dict>
  266. // CHECK-NEXT: <key>line</key><integer>14</integer>
  267. // CHECK-NEXT: <key>col</key><integer>3</integer>
  268. // CHECK-NEXT: <key>file</key><integer>0</integer>
  269. // CHECK-NEXT: </dict>
  270. // CHECK-NEXT: </dict>
  271. // CHECK-NEXT: <dict>
  272. // CHECK-NEXT: <key>path</key>
  273. // CHECK-NEXT: <array>
  274. // CHECK-NEXT: <dict>
  275. // CHECK-NEXT: <key>kind</key><string>event</string>
  276. // CHECK-NEXT: <key>location</key>
  277. // CHECK-NEXT: <dict>
  278. // CHECK-NEXT: <key>line</key><integer>25</integer>
  279. // CHECK-NEXT: <key>col</key><integer>2</integer>
  280. // CHECK-NEXT: <key>file</key><integer>0</integer>
  281. // CHECK-NEXT: </dict>
  282. // CHECK-NEXT: <key>ranges</key>
  283. // CHECK-NEXT: <array>
  284. // CHECK-NEXT: <array>
  285. // CHECK-NEXT: <dict>
  286. // CHECK-NEXT: <key>line</key><integer>25</integer>
  287. // CHECK-NEXT: <key>col</key><integer>2</integer>
  288. // CHECK-NEXT: <key>file</key><integer>0</integer>
  289. // CHECK-NEXT: </dict>
  290. // CHECK-NEXT: <dict>
  291. // CHECK-NEXT: <key>line</key><integer>25</integer>
  292. // CHECK-NEXT: <key>col</key><integer>12</integer>
  293. // CHECK-NEXT: <key>file</key><integer>0</integer>
  294. // CHECK-NEXT: </dict>
  295. // CHECK-NEXT: </array>
  296. // CHECK-NEXT: </array>
  297. // CHECK-NEXT: <key>depth</key><integer>0</integer>
  298. // CHECK-NEXT: <key>extended_message</key>
  299. // CHECK-NEXT: <string>Calling &apos;Odd::kill&apos;</string>
  300. // CHECK-NEXT: <key>message</key>
  301. // CHECK-NEXT: <string>Calling &apos;Odd::kill&apos;</string>
  302. // CHECK-NEXT: </dict>
  303. // CHECK-NEXT: <dict>
  304. // CHECK-NEXT: <key>kind</key><string>event</string>
  305. // CHECK-NEXT: <key>location</key>
  306. // CHECK-NEXT: <dict>
  307. // CHECK-NEXT: <key>line</key><integer>19</integer>
  308. // CHECK-NEXT: <key>col</key><integer>2</integer>
  309. // CHECK-NEXT: <key>file</key><integer>0</integer>
  310. // CHECK-NEXT: </dict>
  311. // CHECK-NEXT: <key>depth</key><integer>1</integer>
  312. // CHECK-NEXT: <key>extended_message</key>
  313. // CHECK-NEXT: <string>Entered call from &apos;test&apos;</string>
  314. // CHECK-NEXT: <key>message</key>
  315. // CHECK-NEXT: <string>Entered call from &apos;test&apos;</string>
  316. // CHECK-NEXT: </dict>
  317. // CHECK-NEXT: <dict>
  318. // CHECK-NEXT: <key>kind</key><string>control</string>
  319. // CHECK-NEXT: <key>edges</key>
  320. // CHECK-NEXT: <array>
  321. // CHECK-NEXT: <dict>
  322. // CHECK-NEXT: <key>start</key>
  323. // CHECK-NEXT: <array>
  324. // CHECK-NEXT: <dict>
  325. // CHECK-NEXT: <key>line</key><integer>19</integer>
  326. // CHECK-NEXT: <key>col</key><integer>2</integer>
  327. // CHECK-NEXT: <key>file</key><integer>0</integer>
  328. // CHECK-NEXT: </dict>
  329. // CHECK-NEXT: <dict>
  330. // CHECK-NEXT: <key>line</key><integer>19</integer>
  331. // CHECK-NEXT: <key>col</key><integer>5</integer>
  332. // CHECK-NEXT: <key>file</key><integer>0</integer>
  333. // CHECK-NEXT: </dict>
  334. // CHECK-NEXT: </array>
  335. // CHECK-NEXT: <key>end</key>
  336. // CHECK-NEXT: <array>
  337. // CHECK-NEXT: <dict>
  338. // CHECK-NEXT: <key>line</key><integer>20</integer>
  339. // CHECK-NEXT: <key>col</key><integer>3</integer>
  340. // CHECK-NEXT: <key>file</key><integer>0</integer>
  341. // CHECK-NEXT: </dict>
  342. // CHECK-NEXT: <dict>
  343. // CHECK-NEXT: <key>line</key><integer>20</integer>
  344. // CHECK-NEXT: <key>col</key><integer>8</integer>
  345. // CHECK-NEXT: <key>file</key><integer>0</integer>
  346. // CHECK-NEXT: </dict>
  347. // CHECK-NEXT: </array>
  348. // CHECK-NEXT: </dict>
  349. // CHECK-NEXT: </array>
  350. // CHECK-NEXT: </dict>
  351. // CHECK-NEXT: <dict>
  352. // CHECK-NEXT: <key>kind</key><string>event</string>
  353. // CHECK-NEXT: <key>location</key>
  354. // CHECK-NEXT: <dict>
  355. // CHECK-NEXT: <key>line</key><integer>20</integer>
  356. // CHECK-NEXT: <key>col</key><integer>3</integer>
  357. // CHECK-NEXT: <key>file</key><integer>0</integer>
  358. // CHECK-NEXT: </dict>
  359. // CHECK-NEXT: <key>ranges</key>
  360. // CHECK-NEXT: <array>
  361. // CHECK-NEXT: <array>
  362. // CHECK-NEXT: <dict>
  363. // CHECK-NEXT: <key>line</key><integer>20</integer>
  364. // CHECK-NEXT: <key>col</key><integer>3</integer>
  365. // CHECK-NEXT: <key>file</key><integer>0</integer>
  366. // CHECK-NEXT: </dict>
  367. // CHECK-NEXT: <dict>
  368. // CHECK-NEXT: <key>line</key><integer>20</integer>
  369. // CHECK-NEXT: <key>col</key><integer>13</integer>
  370. // CHECK-NEXT: <key>file</key><integer>0</integer>
  371. // CHECK-NEXT: </dict>
  372. // CHECK-NEXT: </array>
  373. // CHECK-NEXT: </array>
  374. // CHECK-NEXT: <key>depth</key><integer>1</integer>
  375. // CHECK-NEXT: <key>extended_message</key>
  376. // CHECK-NEXT: <string>Memory is released</string>
  377. // CHECK-NEXT: <key>message</key>
  378. // CHECK-NEXT: <string>Memory is released</string>
  379. // CHECK-NEXT: </dict>
  380. // CHECK-NEXT: <dict>
  381. // CHECK-NEXT: <key>kind</key><string>event</string>
  382. // CHECK-NEXT: <key>location</key>
  383. // CHECK-NEXT: <dict>
  384. // CHECK-NEXT: <key>line</key><integer>25</integer>
  385. // CHECK-NEXT: <key>col</key><integer>2</integer>
  386. // CHECK-NEXT: <key>file</key><integer>0</integer>
  387. // CHECK-NEXT: </dict>
  388. // CHECK-NEXT: <key>ranges</key>
  389. // CHECK-NEXT: <array>
  390. // CHECK-NEXT: <array>
  391. // CHECK-NEXT: <dict>
  392. // CHECK-NEXT: <key>line</key><integer>25</integer>
  393. // CHECK-NEXT: <key>col</key><integer>2</integer>
  394. // CHECK-NEXT: <key>file</key><integer>0</integer>
  395. // CHECK-NEXT: </dict>
  396. // CHECK-NEXT: <dict>
  397. // CHECK-NEXT: <key>line</key><integer>25</integer>
  398. // CHECK-NEXT: <key>col</key><integer>12</integer>
  399. // CHECK-NEXT: <key>file</key><integer>0</integer>
  400. // CHECK-NEXT: </dict>
  401. // CHECK-NEXT: </array>
  402. // CHECK-NEXT: </array>
  403. // CHECK-NEXT: <key>depth</key><integer>0</integer>
  404. // CHECK-NEXT: <key>extended_message</key>
  405. // CHECK-NEXT: <string>Returning; memory was released</string>
  406. // CHECK-NEXT: <key>message</key>
  407. // CHECK-NEXT: <string>Returning; memory was released</string>
  408. // CHECK-NEXT: </dict>
  409. // CHECK-NEXT: <dict>
  410. // CHECK-NEXT: <key>kind</key><string>control</string>
  411. // CHECK-NEXT: <key>edges</key>
  412. // CHECK-NEXT: <array>
  413. // CHECK-NEXT: <dict>
  414. // CHECK-NEXT: <key>start</key>
  415. // CHECK-NEXT: <array>
  416. // CHECK-NEXT: <dict>
  417. // CHECK-NEXT: <key>line</key><integer>25</integer>
  418. // CHECK-NEXT: <key>col</key><integer>2</integer>
  419. // CHECK-NEXT: <key>file</key><integer>0</integer>
  420. // CHECK-NEXT: </dict>
  421. // CHECK-NEXT: <dict>
  422. // CHECK-NEXT: <key>line</key><integer>25</integer>
  423. // CHECK-NEXT: <key>col</key><integer>4</integer>
  424. // CHECK-NEXT: <key>file</key><integer>0</integer>
  425. // CHECK-NEXT: </dict>
  426. // CHECK-NEXT: </array>
  427. // CHECK-NEXT: <key>end</key>
  428. // CHECK-NEXT: <array>
  429. // CHECK-NEXT: <dict>
  430. // CHECK-NEXT: <key>line</key><integer>27</integer>
  431. // CHECK-NEXT: <key>col</key><integer>2</integer>
  432. // CHECK-NEXT: <key>file</key><integer>0</integer>
  433. // CHECK-NEXT: </dict>
  434. // CHECK-NEXT: <dict>
  435. // CHECK-NEXT: <key>line</key><integer>27</integer>
  436. // CHECK-NEXT: <key>col</key><integer>7</integer>
  437. // CHECK-NEXT: <key>file</key><integer>0</integer>
  438. // CHECK-NEXT: </dict>
  439. // CHECK-NEXT: </array>
  440. // CHECK-NEXT: </dict>
  441. // CHECK-NEXT: </array>
  442. // CHECK-NEXT: </dict>
  443. // CHECK-NEXT: <dict>
  444. // CHECK-NEXT: <key>kind</key><string>event</string>
  445. // CHECK-NEXT: <key>location</key>
  446. // CHECK-NEXT: <dict>
  447. // CHECK-NEXT: <key>line</key><integer>27</integer>
  448. // CHECK-NEXT: <key>col</key><integer>2</integer>
  449. // CHECK-NEXT: <key>file</key><integer>0</integer>
  450. // CHECK-NEXT: </dict>
  451. // CHECK-NEXT: <key>ranges</key>
  452. // CHECK-NEXT: <array>
  453. // CHECK-NEXT: <array>
  454. // CHECK-NEXT: <dict>
  455. // CHECK-NEXT: <key>line</key><integer>27</integer>
  456. // CHECK-NEXT: <key>col</key><integer>2</integer>
  457. // CHECK-NEXT: <key>file</key><integer>0</integer>
  458. // CHECK-NEXT: </dict>
  459. // CHECK-NEXT: <dict>
  460. // CHECK-NEXT: <key>line</key><integer>27</integer>
  461. // CHECK-NEXT: <key>col</key><integer>11</integer>
  462. // CHECK-NEXT: <key>file</key><integer>0</integer>
  463. // CHECK-NEXT: </dict>
  464. // CHECK-NEXT: </array>
  465. // CHECK-NEXT: </array>
  466. // CHECK-NEXT: <key>depth</key><integer>0</integer>
  467. // CHECK-NEXT: <key>extended_message</key>
  468. // CHECK-NEXT: <string>Attempt to free released memory</string>
  469. // CHECK-NEXT: <key>message</key>
  470. // CHECK-NEXT: <string>Attempt to free released memory</string>
  471. // CHECK-NEXT: </dict>
  472. // CHECK-NEXT: </array>
  473. // CHECK-NEXT: <key>description</key><string>Attempt to free released memory</string>
  474. // CHECK-NEXT: <key>category</key><string>Memory error</string>
  475. // CHECK-NEXT: <key>type</key><string>Double free</string>
  476. // CHECK-NEXT: <key>check_name</key><string>cplusplus.NewDelete</string>
  477. // CHECK-NEXT: <!-- This hash is experimental and going to change! -->
  478. // CHECK-NEXT: <key>issue_hash_content_of_line_in_context</key><string>8bf1a5b9fdae9d86780aa6c4cdce2605</string>
  479. // CHECK-NEXT: <key>issue_context_kind</key><string>function</string>
  480. // CHECK-NEXT: <key>issue_context</key><string>test</string>
  481. // CHECK-NEXT: <key>issue_hash_function_offset</key><string>3</string>
  482. // CHECK-NEXT: <key>location</key>
  483. // CHECK-NEXT: <dict>
  484. // CHECK-NEXT: <key>line</key><integer>27</integer>
  485. // CHECK-NEXT: <key>col</key><integer>2</integer>
  486. // CHECK-NEXT: <key>file</key><integer>0</integer>
  487. // CHECK-NEXT: </dict>
  488. // CHECK-NEXT: </dict>
  489. // CHECK-NEXT: </array>