/omalloc/omtTestError.c

https://github.com/mmklee/Sources · C · 436 lines · 408 code · 27 blank · 1 comment · 108 complexity · 3dfbac478883dbba67a045ce0ded2e17 MD5 · raw file

  1. #include <omalloc/omtTest.h>
  2. #define OM_CHECK 1
  3. #include <omalloc/om_Alloc.h>
  4. struct LongSpec
  5. {
  6. int MaxSize;
  7. int MinSize;
  8. int MinTrack;
  9. int NotIsBin;
  10. int NoTrack;
  11. int NotZero;
  12. };
  13. omMemCell omFindCell(struct LongSpec spec)
  14. {
  15. int i;
  16. for (i=0; i<MAX_CELLS; i++)
  17. {
  18. if ((cells[i].addr != NULL) &&
  19. (spec.MinTrack == 0 || (DO_CHECK(cells[i].spec) &&
  20. DO_TRACK(cells[i].spec) &&
  21. GET_TRACK(cells[i].spec) >= spec.MinTrack)) &&
  22. (spec.MinSize == 0 || GET_SIZE(cells[i].spec) >= spec.MinSize) &&
  23. (spec.MaxSize == 0 || GET_SIZE(cells[i].spec) <= spec.MaxSize) &&
  24. (spec.NotIsBin == 0 || cells[i].bin == NULL) &&
  25. (spec.NotZero == 0 || !IS_ZERO(cells[i].spec)) &&
  26. (spec.NoTrack == 0 || !DO_CHECK(cells[i].spec) || !DO_TRACK(cells[i].spec)))
  27. {
  28. return &cells[i];
  29. }
  30. }
  31. return NULL;
  32. }
  33. int omtTestErrors()
  34. {
  35. #ifndef OM_NDEBUG
  36. int level = om_Opts.MinCheck;
  37. omError_t error;
  38. struct LongSpec spec;
  39. int missed = 0, alloc;
  40. omMemCell cell = NULL;
  41. printf("omtTestErrors: Start\n");
  42. om_Opts.MinCheck = 2;
  43. for (error = omError_MemoryCorrupted; error < omError_MaxError; error++)
  44. {
  45. om_InternalErrorStatus = omError_NoError;
  46. om_ErrorStatus = omError_NoError;
  47. printf("!!!expect %s\n", omError2Serror(error));
  48. memset(&spec, 0, sizeof(struct LongSpec));
  49. cell = NULL;
  50. alloc = 0;
  51. switch (error)
  52. {
  53. case omError_MemoryCorrupted:
  54. {
  55. spec.MaxSize = OM_MAX_BLOCK_SIZE;
  56. cell = omFindCell(spec);
  57. if (cell != NULL)
  58. {
  59. omBin bin = omGetTopBinOfAddr(cell->addr);
  60. omBinPage last_page = bin->last_page;
  61. omAssume(last_page != NULL);
  62. bin->last_page = NULL;
  63. omDebugBin(cell->bin);
  64. bin->last_page = last_page;
  65. }
  66. else printf("cell not found\n");
  67. break;
  68. }
  69. case omError_NullAddr:
  70. {
  71. omDebugAddr(NULL);
  72. break;
  73. }
  74. case omError_InvalidRangeAddr:
  75. {
  76. omDebugAddr((void*) om_MaxAddr);
  77. break;
  78. }
  79. case omError_FalseAddr:
  80. {
  81. spec.MinSize = 8;
  82. spec.MaxSize = OM_MAX_BLOCK_SIZE;
  83. spec.NoTrack = 1;
  84. cell = omFindCell(spec);
  85. if (cell != NULL)
  86. {
  87. omDebugAddr(cell->addr + SIZEOF_VOIDP);
  88. }
  89. else printf("cell not found\n");
  90. break;
  91. }
  92. case omError_FalseAddrOrMemoryCorrupted:
  93. {
  94. spec.MinSize = 8;
  95. spec.MinTrack = 3;
  96. cell = omFindCell(spec);
  97. if (cell != NULL)
  98. {
  99. omDebugAddr(cell->addr + SIZEOF_VOIDP);
  100. }
  101. else printf("cell not found\n");
  102. break;
  103. }
  104. case omError_WrongSize:
  105. {
  106. spec.MaxSize = OM_MAX_BLOCK_SIZE;
  107. cell = omFindCell(spec);
  108. if (cell != NULL)
  109. {
  110. omDebugAddrSize(cell->addr, OM_MAX_BLOCK_SIZE + 1);
  111. if (om_ErrorStatus != omError_NoError)
  112. {
  113. om_ErrorStatus = omError_NoError;
  114. spec.MaxSize = 0;
  115. spec.MinTrack = 3;
  116. spec.NotIsBin = 1;
  117. spec.MinSize = 2;
  118. cell = omFindCell(spec);
  119. if (cell != NULL)
  120. {
  121. omDebugAddrSize(cell->addr, GET_SIZE(cell->spec) + SIZEOF_OM_ALIGNMENT);
  122. if (om_ErrorStatus != omError_NoError)
  123. {
  124. om_ErrorStatus = omError_NoError;
  125. spec.MaxSize = OM_MAX_BLOCK_SIZE;
  126. spec.MinTrack = 0;
  127. spec.NotIsBin = 0;
  128. cell = omFindCell(spec);
  129. if (cell != NULL)
  130. omDebugBinAddrSize(cell->addr, GET_SIZE(cell->spec) - 1);
  131. else printf("cell not found");
  132. }
  133. }
  134. else printf("cell not found\n");
  135. }
  136. }
  137. else printf("cell not found\n");
  138. break;
  139. }
  140. case omError_FreedAddr:
  141. {
  142. #if KEEP_LEVEL > 0
  143. void* addr = om_AlwaysKeptAddrs;
  144. while (addr != NULL && omIsTrackAddr(addr))
  145. {
  146. addr = *((void**) addr);
  147. }
  148. if (addr != NULL)
  149. {
  150. omFree(addr);
  151. if (om_ErrorStatus == omError_FreedAddr)
  152. {
  153. om_ErrorStatus = omError_NoError;
  154. addr = om_AlwaysKeptAddrs;
  155. while (addr != NULL && ! omIsTrackAddr(addr))
  156. {
  157. addr = *((void**) addr);
  158. }
  159. if (addr != NULL)
  160. {
  161. addr = omAddr_2_OutAddr(addr);
  162. omFree(addr);
  163. }
  164. }
  165. }
  166. if (addr == NULL)
  167. {
  168. printf("addr not found\n");
  169. break;
  170. }
  171. if (om_ErrorStatus != omError_FreedAddr)
  172. break;
  173. #endif
  174. spec.MinTrack = 5;
  175. spec.NotIsBin = 1;
  176. cell = omFindCell(spec);
  177. if (cell != NULL)
  178. {
  179. omFree(cell->addr);
  180. omFree(cell->addr);
  181. alloc = 1;
  182. cell->addr=NULL;
  183. }
  184. else printf("cell not found\n");
  185. break;
  186. }
  187. case omError_FreedAddrOrMemoryCorrupted:
  188. {
  189. spec.MaxSize = OM_MAX_BLOCK_SIZE;
  190. spec.NoTrack = 1;
  191. cell = omFindCell(spec);
  192. if (cell != NULL)
  193. {
  194. omBinPage page = omGetBinPageOfAddr(cell->addr);
  195. omBinPageRegion region = page->region;
  196. page->region = NULL;
  197. om_Opts.MinCheck = 1;
  198. omDebugAddr(cell->addr);
  199. om_Opts.MinCheck = 2;
  200. page->region = region;
  201. }
  202. else printf("cell not found\n");
  203. break;
  204. }
  205. case omError_WrongBin:
  206. {
  207. spec.MaxSize = 32;
  208. spec.NoTrack = 1;
  209. cell = omFindCell(spec);
  210. if (cell != NULL)
  211. {
  212. omDebugAddrBin(cell->addr, &om_StaticBin[OM_MAX_BIN_INDEX]);
  213. }
  214. else printf("cell not found\n");
  215. break;
  216. }
  217. case omError_UnknownBin:
  218. {
  219. spec.MaxSize = OM_MAX_BLOCK_SIZE;
  220. cell = omFindCell(spec);
  221. if (cell != NULL)
  222. {
  223. omDebugAddrBin(cell->addr, (void*) omGetTopBinOfAddr(cell->addr) + SIZEOF_VOIDP);
  224. }
  225. else printf("cell not found\n");
  226. break;
  227. }
  228. case omError_NotBinAddr:
  229. {
  230. spec.NotIsBin = 1;
  231. spec.MinSize = OM_MAX_BLOCK_SIZE + 1;
  232. cell = omFindCell(spec);
  233. if (cell != NULL)
  234. {
  235. omDebugBinAddr(cell->addr);
  236. }
  237. else printf("cell not found");
  238. break;
  239. }
  240. case omError_UnalignedAddr:
  241. {
  242. cell = omFindCell(spec);
  243. if (cell != NULL)
  244. {
  245. omDebugAddr(cell->addr + 1);
  246. }
  247. else printf("cell not found\n");
  248. break;
  249. }
  250. case omError_NullSizeAlloc:
  251. {
  252. void* addr = omAlloc(0);
  253. addr = omRealloc(addr, 0);
  254. omFree(addr);
  255. break;
  256. }
  257. case omError_ListCycleError:
  258. {
  259. void* last = omListLast(om_SpecBin);
  260. if (last != NULL)
  261. {
  262. *((void**)last) = om_SpecBin;
  263. omCheckList(om_SpecBin, 5, omError_NoError, OM_FLR);
  264. *((void**)last) = NULL;
  265. } else printf("last == NULL\n");
  266. break;
  267. }
  268. case omError_SortedListError:
  269. {
  270. if (om_SpecBin != NULL && om_SpecBin->next != NULL)
  271. {
  272. int max_blocks = om_SpecBin->max_blocks;
  273. om_SpecBin->max_blocks = om_SpecBin->next->max_blocks + 1;
  274. omCheckSortedList(om_SpecBin, max_blocks, 5, omError_NoError, OM_FLR);
  275. om_SpecBin->max_blocks = max_blocks;
  276. } else printf("om_SpecBin->next == NULL\n");
  277. break;
  278. }
  279. case omError_KeptAddrListCorrupted:
  280. {
  281. if (om_KeptAddr != NULL)
  282. {
  283. void* last = omListLast(om_KeptAddr);
  284. *((void**)last) = om_KeptAddr;
  285. om_Opts.MinCheck = 5;
  286. omDebugMemory();
  287. om_Opts.MinCheck = 2;
  288. *((void**)last) = NULL;
  289. }
  290. else printf("om_KeptAddr == NULL\n");
  291. break;
  292. }
  293. case omError_FreePattern:
  294. {
  295. if (om_Opts.Keep > 0)
  296. {
  297. spec.MinTrack=3;
  298. spec.NotIsBin = 1;
  299. cell = omFindCell(spec);
  300. if (cell != NULL)
  301. {
  302. void* value;
  303. omFree(cell->addr);
  304. value = *((void**) cell->addr);
  305. *((void**) cell->addr) = value -1;
  306. omDebugMemory();
  307. *((void**) cell->addr) = value;
  308. alloc = 1;
  309. cell->addr = NULL;
  310. }
  311. else printf("cell not found\n");
  312. }
  313. else printf("om_Opts.Keep == 0");
  314. break;
  315. }
  316. case omError_BackPattern:
  317. {
  318. spec.MinTrack = 3;
  319. spec.NotIsBin = 1;
  320. cell = omFindCell(spec);
  321. if (cell != NULL)
  322. {
  323. void* addr = cell->addr + omSizeOfAddr(cell->addr);
  324. void* value = *((void**) addr);
  325. *((void**) addr) = value -1;
  326. omDebugAddr(cell->addr);
  327. *((void**) addr) = value;
  328. }
  329. else printf("cell not found\n");
  330. break;
  331. }
  332. case omError_FrontPattern:
  333. {
  334. spec.MinTrack=3;
  335. cell = omFindCell(spec);
  336. if (cell != NULL)
  337. {
  338. void* addr = cell->addr - SIZEOF_VOIDP;
  339. void* value = *((void**) addr);
  340. *((void**) addr) = value -1;
  341. omDebugAddr(cell->addr);
  342. *((void**) addr) = value;
  343. }
  344. else printf("cell not found\n");
  345. break;
  346. }
  347. case omError_NotString:
  348. {
  349. /* can only test for NULL string */
  350. #if 0
  351. spec.MaxSize = OM_MAX_BLOCK_SIZE;
  352. cell = omFindCell(spec);
  353. if (cell != NULL)
  354. {
  355. char* addr = (char*) cell->addr;
  356. char* s;
  357. memset(cell->addr, 1, omSizeOfAddr(cell->addr));
  358. omDebugAddr(cell->addr);
  359. s = omStrDup(addr);
  360. omFree(s);
  361. InitCellAddrContent(cell);
  362. }
  363. else printf("cell not found\n");
  364. break;
  365. #endif
  366. omStrDup(NULL);
  367. break;
  368. }
  369. case omError_StickyBin:
  370. {
  371. omMergeStickyBinIntoBin(NULL, NULL);
  372. break;
  373. }
  374. default:
  375. printf("No Error test implemented\n");
  376. }
  377. if (om_ErrorStatus != error)
  378. {
  379. printf("---missed %s\n", omError2Serror(error));
  380. missed++;
  381. }
  382. else
  383. {
  384. printf("+++ok %s\n", omError2Serror(error));
  385. }
  386. om_ErrorStatus = omError_NoError;
  387. if (cell != NULL)
  388. {
  389. if (alloc) TestAlloc(cell, cell->spec);
  390. omtTestDebug(cell);
  391. }
  392. else
  393. {
  394. omDebugMemory();
  395. }
  396. if (om_ErrorStatus != omError_NoError)
  397. {
  398. printf("omtTest panik: memory corrupted\n\n");
  399. return -1;
  400. }
  401. printf("\n");
  402. }
  403. printf("omtTestErrors: Summary: missed = %d\n\n", missed);
  404. om_Opts.MinCheck = level;
  405. return missed;
  406. #else
  407. return 0;
  408. #endif
  409. }