check_alloc.c
上传用户:tany51
上传日期:2013-06-12
资源大小:1397k
文件大小:6k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /*
  2.  * Copyright (C) 2000,2001  Ross Combs (rocombs@cs.nmsu.edu)
  3.  *
  4.  * This program is free software; you can redistribute it and/or
  5.  * modify it under the terms of the GNU General Public License
  6.  * as published by the Free Software Foundation; either version 2
  7.  * of the License, or (at your option) any later version.
  8.  *
  9.  * This program is distributed in the hope that it will be useful,
  10.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  * GNU General Public License for more details.
  13.  *
  14.  * You should have received a copy of the GNU General Public License
  15.  * along with this program; if not, write to the Free Software
  16.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  17.  */
  18. #define CHECK_ALLOC_INTERNAL_ACCESS
  19. #include "common/setup_before.h"
  20. #ifdef USE_CHECK_ALLOC
  21. #ifdef HAVE_STDDEF_H
  22. # include <stddef.h>
  23. #else
  24. # ifndef NULL
  25. #  define NULL ((void *)0)
  26. # endif
  27. #endif
  28. #include <stdio.h>
  29. #ifdef STDC_HEADERS
  30. # include <stdlib.h>
  31. #else
  32. # ifdef HAVE_MALLOC_H
  33. #  include <malloc.h>
  34. # endif
  35. #endif
  36. #ifdef HAVE_STRING_H
  37. # include <string.h>
  38. #else
  39. # ifdef HAVE_STRINGS_H
  40. #  include <strings.h>
  41. # endif
  42. #endif
  43. #include "common/check_alloc.h"
  44. #include "common/setup_after.h"
  45. static FILE *    logfp;
  46. static t_alist * head;
  47. static int add_item(char const * func, void * ptr, unsigned int size, char const * file_name, int line_number);
  48. static int del_item(char const * func, void * ptr, unsigned int size, char const * file_name, int line_number);
  49. static unsigned int get_size(void const * ptr);
  50. static int add_item(char const * func, void * ptr, unsigned int size, char const * file_name, int line_number)
  51. {
  52.     t_alist * new;
  53.     t_alist * curr;
  54.     t_alist * * change;
  55.     
  56.     change = &head;
  57.     for (curr=head; curr; curr=curr->next)
  58.     {
  59. if (curr->ptr==ptr)
  60. {
  61.     if (logfp)
  62. fprintf(logfp,"Missing free for %p = %s(%u) in %s:%dn",curr->ptr,curr->func,curr->size,curr->file_name,curr->line_number);
  63.     curr->func = func;
  64.     curr->ptr = ptr;
  65.     curr->size = size;
  66.     curr->file_name = file_name;
  67.     curr->line_number = line_number;
  68.     return -1;
  69. }
  70. change = &curr->next;
  71.     }
  72.     
  73.     if (!(new = malloc(sizeof(t_alist))))
  74.     {
  75. if (logfp)
  76.     fprintf(logfp,"Internal allocation failuren");
  77. return -1;
  78.     }
  79.     new->func = func;
  80.     new->ptr = ptr;
  81.     new->size = size;
  82.     new->file_name = file_name;
  83.     new->line_number = line_number;
  84.     new->next = NULL;
  85.     
  86.     *change = new;
  87.     
  88.     return 0;
  89. }
  90. static int del_item(char const * func, void * ptr, unsigned int size, char const * file_name, int line_number)
  91. {
  92.     t_alist * curr;
  93.     t_alist * * change;
  94.     
  95.     change = &head;
  96.     for (curr=head; curr; curr=curr->next)
  97.     {
  98. if (curr->ptr==ptr)
  99.     break;
  100. change = &curr->next;
  101.     }
  102.     
  103.     if (!curr)
  104.     {
  105. if (logfp)
  106.     fprintf(logfp,"Extra %s(%p) of object in %s:%dn",func,ptr,file_name,line_number);
  107. return -1;
  108.     }
  109.     
  110.     *change = curr->next;
  111.     free(curr);
  112.     
  113.     return 0;
  114. }
  115. static unsigned int get_size(void const * ptr)
  116. {
  117.     t_alist * curr;
  118.     
  119.     for (curr=head; curr; curr=curr->next)
  120. if (curr->ptr==ptr)
  121.     return curr->size;
  122.     
  123.     return 0;
  124. }
  125. extern void check_set_file(FILE * fp)
  126. {
  127.     logfp = fp;
  128. }
  129. extern int check_report_usage(void)
  130. {
  131.     t_alist *     curr;
  132.     unsigned long countmem;
  133.     unsigned int  countobj;
  134.     
  135.     if (!logfp)
  136. return -1;
  137.     
  138.     countmem = 0;
  139.     countobj = 0;
  140.     for (curr=head; curr; curr=curr->next)
  141.     {
  142. fprintf(logfp,"%s:%d:%p=%s(%u)n",curr->file_name,curr->line_number,curr->ptr,curr->func,curr->size);
  143. countmem += curr->size;
  144.         countobj++;
  145.     }
  146.     fprintf(logfp,"Total allocated memory is %lu bytes in %u objects.n",countmem,countobj);
  147.     
  148.     return 0;
  149. }
  150. extern void check_cleanup(void)
  151. {
  152.     t_alist *     curr;
  153.     t_alist *     next;
  154.     unsigned long countmem;
  155.     unsigned int  countobj;
  156.     
  157.     countmem = 0;
  158.     countobj = 0;
  159.     for (curr=head; curr; curr=next)
  160.     {
  161. next = curr->next;
  162. if (logfp)
  163.     fprintf(logfp,"Missing free for %p = %s(%u) in %s:%dn",curr->ptr,curr->func,curr->size,curr->file_name,curr->line_number);
  164. countmem += curr->size;
  165.         countobj++;
  166. free(curr);
  167.     }
  168.     fprintf(logfp,"Total unfreed memory is %lu bytes in %u objects.n",countmem,countobj);
  169. }
  170. extern void * check_malloc_real(unsigned int size, char const * file_name, int line_number)
  171. {
  172.     void * ptr;
  173.     
  174.     ptr = malloc(size);
  175.     if (ptr)
  176. memset(ptr,'D',size); /* 0x44 */
  177.     
  178.     add_item("malloc",ptr,size,file_name,line_number);
  179.     
  180.     return ptr;
  181. }
  182. extern void * check_calloc_real(unsigned int nelem, unsigned int size, char const * file_name, int line_number)
  183. {
  184.     void * ptr;
  185.     
  186.     ptr = calloc(nelem,size);
  187.     
  188.     add_item("calloc",ptr,size*nelem,file_name,line_number);
  189.     
  190.     return ptr;
  191. }
  192. extern void * check_realloc_real(void * in_ptr, unsigned int size, char const * file_name, int line_number)
  193. {
  194.     unsigned int oldsize;
  195.     void *       out_ptr;
  196.     
  197.     if (size)
  198.     {
  199. out_ptr = malloc(size);
  200. if (out_ptr)
  201.     memset(out_ptr,'D',size); /* 0x44 */
  202. add_item("realloc",out_ptr,size,file_name,line_number);
  203.     }
  204.     else
  205. out_ptr = NULL;
  206.     
  207.     if (in_ptr)
  208.     {
  209. oldsize = get_size(in_ptr);
  210. if (out_ptr)
  211.     memcpy(out_ptr,in_ptr,oldsize<size?oldsize:size);
  212. memset(in_ptr,'U',oldsize); /* 0x55 */
  213. free(in_ptr);
  214. del_item("realloc",in_ptr,oldsize,file_name,line_number);
  215.     }
  216.     
  217.     return out_ptr;
  218. }
  219. extern void check_free_real(void * ptr, char const * file_name, int line_number)
  220. {
  221.     unsigned int oldsize;
  222.     
  223.     oldsize = get_size(ptr);
  224.     memset(ptr,'U',oldsize); /* 0x55 */
  225.     free(ptr);
  226.     
  227.     del_item("free",ptr,oldsize,file_name,line_number);
  228. }
  229. extern void check_cfree_real(void * ptr, char const * file_name, int line_number)
  230. {
  231.     unsigned int oldsize;
  232.     
  233.     oldsize = get_size(ptr);
  234.     memset(ptr,'U',oldsize); /* 0x55 */
  235.     cfree(ptr);
  236.     
  237.     del_item("cfree",ptr,oldsize,file_name,line_number);
  238. }
  239. extern void * check_strdup_real(char const * str, char const * file_name, int line_number)
  240. {
  241.     void * ptr;
  242.     
  243.     if (!str)
  244.     {
  245. if (logfp)
  246.     fprintf(logfp,"Got NULL string to duplicate in %s:%dn",file_name,line_number);
  247. return NULL;
  248.     }
  249.     
  250.     ptr = strdup(str);
  251.     
  252.     add_item("strdup",ptr,strlen(str)+1,file_name,line_number);
  253.     
  254.     return ptr;
  255. }
  256. #else
  257. typedef int filenotempty; /* make ISO standard happy */
  258. #endif