Tizen 2.1 base
[platform/upstream/glib2.0.git] / glib / tests / mem-overflow.c
index 9ebd443..c7ea218 100644 (file)
  * if advised of the possibility of such damage.
  */
 
+/* We test for errors in optimize-only definitions in gmem.h */
+
+#pragma GCC optimize (1)
+
 #include "glib.h"
 #include <stdlib.h>
 
@@ -30,6 +34,7 @@ mem_overflow (void)
   gpointer p, q;
   typedef char X[10];
 
+  /* "FAIL" here apparently means "fail to overflow"... */
 #define CHECK_PASS(P)  p = (P); g_assert (p == NULL);
 #define CHECK_FAIL(P)  p = (P); g_assert (p != NULL);
 
@@ -37,24 +42,28 @@ mem_overflow (void)
   CHECK_PASS (g_try_malloc_n (a, b));
   CHECK_PASS (g_try_malloc_n (b, a));
   CHECK_FAIL (g_try_malloc_n (b, b));
+  g_free (p);
 
   CHECK_PASS (g_try_malloc0_n (a, a));
   CHECK_PASS (g_try_malloc0_n (a, b));
   CHECK_PASS (g_try_malloc0_n (b, a));
   CHECK_FAIL (g_try_malloc0_n (b, b));
+  g_free (p);
 
   q = g_malloc (1);
   CHECK_PASS (g_try_realloc_n (q, a, a));
   CHECK_PASS (g_try_realloc_n (q, a, b));
   CHECK_PASS (g_try_realloc_n (q, b, a));
   CHECK_FAIL (g_try_realloc_n (q, b, b));
-  free (p);
+  g_free (p);
 
   CHECK_PASS (g_try_new (X, a));
   CHECK_FAIL (g_try_new (X, b));
+  g_free (p);
 
   CHECK_PASS (g_try_new0 (X, a));
   CHECK_FAIL (g_try_new0 (X, b));
+  g_free (p);
 
   q = g_try_malloc (1);
   CHECK_PASS (g_try_renew (X, q, a));
@@ -64,8 +73,29 @@ mem_overflow (void)
 #undef CHECK_FAIL
 #undef CHECK_PASS
 
-#define CHECK_FAIL(P)  if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) { p = (P); exit (0); } g_test_trap_assert_failed();
-#define CHECK_PASS(P)  if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) { p = (P); exit (0); } g_test_trap_assert_passed();
+#define CHECK_FAIL(P)  do { \
+      if (g_test_undefined ()) \
+        { \
+          if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) \
+            { \
+              p = (P); \
+              exit (0); \
+            } \
+          \
+          g_test_trap_assert_failed(); \
+        } \
+    } while (0)
+
+#define CHECK_PASS(P)  do { \
+      if (g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR)) \
+        { \
+          p = (P); \
+          g_free (p); \
+          exit (0); \
+        } \
+      \
+      g_test_trap_assert_passed(); \
+    } while (0)
 
   CHECK_FAIL (g_malloc_n (a, a));
   CHECK_FAIL (g_malloc_n (a, b));
@@ -82,7 +112,7 @@ mem_overflow (void)
   CHECK_FAIL (g_realloc_n (q, a, b));
   CHECK_FAIL (g_realloc_n (q, b, a));
   CHECK_PASS (g_realloc_n (q, b, b));
-  free (q);
+  g_free (q);
 
   CHECK_FAIL (g_new (X, a));
   CHECK_PASS (g_new (X, b));
@@ -93,7 +123,29 @@ mem_overflow (void)
   q = g_malloc (1);
   CHECK_FAIL (g_renew (X, q, a));
   CHECK_PASS (g_renew (X, q, b));
-  free (q);
+  g_free (q);
+}
+
+typedef struct
+{
+} Empty;
+
+static void
+empty_alloc (void)
+{
+  g_test_bug ("615379");
+
+  g_assert_cmpint (sizeof (Empty), ==, 0);
+
+  if (g_test_trap_fork (0, 0))
+    {
+      Empty *empty;
+
+      empty = g_new0 (Empty, 1);
+      g_assert (empty == NULL);
+      exit (0);
+    }
+  g_test_trap_assert_passed ();
 }
 
 int
@@ -102,7 +154,10 @@ main (int   argc,
 {
   g_test_init (&argc, &argv, NULL);
 
+  g_test_bug_base ("http://bugzilla.gnome.org/");
+
   g_test_add_func ("/mem/overflow", mem_overflow);
+  g_test_add_func ("/mem/empty-alloc", empty_alloc);
 
   return g_test_run();
 }