Bläddra i källkod

stb_leakcheck: Fix warnings.

1. const char* for __FILE__ (string literals are const)
2. Use %zd to print size_t where available; the only real problem
   here is Visual C++. Use long long on the VC++ vers that support
   64-bit targets but not %zd, int on the even older 32-bit-only
   VC++ vers that don't support "long long" either.

Fixes #459. I think. (It's hard to be sure since the issue doesn't
state the exact warning message.)
Fabian Giesen 8 år sedan
förälder
incheckning
501812f307
1 ändrade filer med 23 tillägg och 3 borttagningar
  1. 23 3
      stb_leakcheck.h

+ 23 - 3
stb_leakcheck.h

@@ -22,7 +22,7 @@ typedef struct malloc_info stb_leakcheck_malloc_info;
 
 struct malloc_info
 {
-   char *file;
+   const char *file;
    int line;
    size_t size;
    stb_leakcheck_malloc_info *next,*prev;
@@ -30,7 +30,7 @@ struct malloc_info
 
 static stb_leakcheck_malloc_info *mi_head;
 
-void *stb_leakcheck_malloc(size_t sz, char *file, int line)
+void *stb_leakcheck_malloc(size_t sz, const char *file, int line)
 {
    stb_leakcheck_malloc_info *mi = (stb_leakcheck_malloc_info *) malloc(sz + sizeof(*mi));
    if (mi == NULL) return mi;
@@ -62,7 +62,7 @@ void stb_leakcheck_free(void *ptr)
    }
 }
 
-void *stb_leakcheck_realloc(void *ptr, size_t sz, char *file, int line)
+void *stb_leakcheck_realloc(void *ptr, size_t sz, const char *file, int line)
 {
    if (ptr == NULL) {
       return stb_leakcheck_malloc(sz, file, line);
@@ -88,11 +88,30 @@ void *stb_leakcheck_realloc(void *ptr, size_t sz, char *file, int line)
    }
 }
 
+static void stblkck_internal_print(const char *reason, const char *file,  int line, size_t size, void *ptr)
+{
+#if (defined(_MSC_VER) && _MSC_VER < 1900) /* 1900=VS 2015 */ || defined(__MINGW32__)
+   // Compilers that use the old MS C runtime library don't have %zd
+   // and the older ones don't even have %lld either... however, the old compilers
+   // without "long long" don't support 64-bit targets either, so here's the
+   // compromise:
+   #if defined(_MSC_VER) && _MSC_VER < 1400 // before VS 2005
+      printf("%-6s: %s (%4d): %8d bytes at %p\n", reason, file, line, (int)size, ptr);
+   #else
+      printf("%-6s: %s (%4d): %8lld bytes at %p\n", reason, file, line, (long long)size, ptr);
+   #endif
+#else
+   // Assume we have %zd on other targets.
+   printf("%-6s: %s (%4d): %zd bytes at %p\n", reason, file, line, size, ptr);
+#endif
+}
+
 void stb_leakcheck_dumpmem(void)
 {
    stb_leakcheck_malloc_info *mi = mi_head;
    while (mi) {
       if ((ptrdiff_t) mi->size >= 0)
+         stblkck_internal_print("LEAKED", mi->file, mi->line, mi->size, mi+1);
          printf("LEAKED: %s (%4d): %8d bytes at %p\n", mi->file, mi->line, (int) mi->size, mi+1);
       mi = mi->next;
    }
@@ -100,6 +119,7 @@ void stb_leakcheck_dumpmem(void)
    mi = mi_head;
    while (mi) {
       if ((ptrdiff_t) mi->size < 0)
+         stblkck_internal_print("FREED", mi->file, mi->line, ~mi->size, mi+1);
          printf("FREED : %s (%4d): %8d bytes at %p\n", mi->file, mi->line, (int) ~mi->size, mi+1);
       mi = mi->next;
    }