This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Patch to "poison" malloc et al. and bzero et al.


Based on a recent discussion with Neil, it turns out that the
integrated preprocessor doesn't choke on poisoned tokens that appear
as a result of the expansion of macros.
 
Therefore it is entirely safe to poison e.g. rindex even if the system
headers #define strrchr rindex.  We can also make use of this effect
if we really want to use the poisoned token by providing an indirect
macro definition, e.g. for cases where we really want to call malloc.
 
I went ahead and poisoned malloc, realloc, calloc, strdup, bzero, bcmp
and rindex.  There were a couple of cases that had to be fixed, which
I did.

This patch survived a full "make" of all languages compiled using the
CVS head to compile itself again on solaris2.7.
 
Ok to install?
 
                --Kaveh
 
2001-03-08  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>

	* fixinc/server.c (load_data, run_shell): Use xmalloc, xrealloc &
	xcalloc in lieu of malloc, realloc & calloc.
	
	* gencheck.c (xmalloc): Use really_call_malloc, not malloc.

	* gengenrtl.c (xmalloc): Likewise.

	* gensupport.c (xcalloc, xrealloc, xmalloc): Use the
	really_call_* memory allocation routines.

	* stmt.c (check_for_full_enumeration_handling): Use
	really_call_calloc, not calloc.

	* system.h (really_call_malloc, really_call_calloc,
	really_call_realloc): Define.
	(malloc, realloc, calloc, strdup, bzero, bcmp, rindex): Poison.
	
f:
	* fini.c (main): Use really_call_malloc, not malloc.
	

diff -rup orig/egcs-CVS20010307/gcc/f/fini.c egcs-CVS20010307/gcc/f/fini.c
--- orig/egcs-CVS20010307/gcc/f/fini.c	Thu Dec  7 22:00:25 2000
+++ egcs-CVS20010307/gcc/f/fini.c	Thu Mar  8 15:45:35 2001
@@ -367,7 +367,7 @@ main (int argc, char **argv)
 
       /* Make new name object to store name and its keyword. */
 
-      newname = (name) malloc (sizeof (*newname));
+      newname = (name) really_call_malloc (sizeof (*newname));
       newname->namelen = strlen (buf);
       newname->kwlen = strlen (kwname);
       total_length = newname->kwlen + fixlengths;
diff -rup orig/egcs-CVS20010307/gcc/fixinc/server.c egcs-CVS20010307/gcc/fixinc/server.c
--- orig/egcs-CVS20010307/gcc/fixinc/server.c	Sat Mar  3 14:05:00 2001
+++ egcs-CVS20010307/gcc/fixinc/server.c	Thu Mar  8 15:53:54 2001
@@ -93,10 +93,7 @@ load_data (fp)
   t_bool got_done = BOOL_FALSE;
 
   text_size = sizeof (z_line) * 2;
-  pz_scan = pz_text = malloc (text_size);
-
-  if (pz_text == (char *) NULL)
-    return (char *) NULL;
+  pz_scan = pz_text = xmalloc (text_size);
 
   for (;;)
     {
@@ -120,18 +117,9 @@ load_data (fp)
       if (text_size - used_ct < sizeof (z_line))
         {
           size_t off = (size_t) (pz_scan - pz_text);
-          void *p;
 	  
           text_size += 4096;
-          p = realloc ((void *) pz_text, text_size);
-          if (p == (void *) NULL)
-            {
-              fprintf (stderr, "Failed to get 0x%08lX bytes\n",
-                      (long) text_size);
-              free ((void *) pz_text);
-              return (char *) NULL;
-            }
-          pz_text = (char *) p;
+          pz_text = xrealloc ((void *) pz_text, text_size);
           pz_scan = pz_text + off;
         }
     }
@@ -146,7 +134,7 @@ load_data (fp)
   while ((pz_scan > pz_text) && ISSPACE (pz_scan[-1]))
     pz_scan--;
   *pz_scan = NUL;
-  return realloc ((void *) pz_text, strlen (pz_text) + 1);
+  return xrealloc ((void *) pz_text, strlen (pz_text) + 1);
 }
 
 
@@ -284,11 +272,8 @@ run_shell (pz_cmd)
   /*  IF it is still not running, THEN return the nil string.  */
   if (server_id <= 0)
     {
-      char *pz = (char *) malloc (1);
       fprintf (stderr, zNoServer, pz_cmd);
-      if (pz != (char *) NULL)
-        *pz = '\0';
-      return pz;
+      return xcalloc (1, 1);
     }
 
   /*  Make sure the process will pay attention to us, send the
@@ -302,11 +287,8 @@ run_shell (pz_cmd)
       THEN return an empty string.  */
   if (server_id == NULLPROCESS)
     {
-      char *pz = (char *) malloc (1);
       fprintf (stderr, zNoServer, pz_cmd);
-      if (pz != (char *) NULL)
-        *pz = '\0';
-      return pz;
+      return xcalloc (1, 1);
     }
 
   /*  Now try to read back all the data.  If we fail due to either a
@@ -326,9 +308,7 @@ run_shell (pz_cmd)
 
         fprintf (stderr, "CLOSING SHELL SERVER - command failure:\n\t%s\n",
                  pz_cmd);
-        pz = (char *) malloc (1);
-        if (pz != (char *) NULL)
-          *pz = '\0';
+        pz = xcalloc (1, 1);
       }
 #ifdef DEBUG
     fprintf( stderr, "run_shell command success:  %s\n", pz );
diff -rup orig/egcs-CVS20010307/gcc/gencheck.c egcs-CVS20010307/gcc/gencheck.c
--- orig/egcs-CVS20010307/gcc/gencheck.c	Wed Jun 14 13:26:17 2000
+++ egcs-CVS20010307/gcc/gencheck.c	Thu Mar  8 15:36:47 2001
@@ -75,7 +75,7 @@ PTR
 xmalloc (nbytes)
   size_t nbytes;
 {
-  register PTR tmp = (PTR) malloc (nbytes);
+  register PTR tmp = (PTR) really_call_malloc (nbytes);
 
   if (!tmp)
     {
diff -rup orig/egcs-CVS20010307/gcc/gengenrtl.c egcs-CVS20010307/gcc/gengenrtl.c
--- orig/egcs-CVS20010307/gcc/gengenrtl.c	Fri Oct 13 02:26:26 2000
+++ egcs-CVS20010307/gcc/gengenrtl.c	Thu Mar  8 15:37:37 2001
@@ -389,7 +389,7 @@ PTR
 xmalloc (nbytes)
   size_t nbytes;
 {
-  register PTR tmp = (PTR) malloc (nbytes);
+  register PTR tmp = (PTR) really_call_malloc (nbytes);
 
   if (!tmp)
     {
diff -rup orig/egcs-CVS20010307/gcc/gensupport.c egcs-CVS20010307/gcc/gensupport.c
--- orig/egcs-CVS20010307/gcc/gensupport.c	Thu Mar  1 20:50:49 2001
+++ egcs-CVS20010307/gcc/gensupport.c	Thu Mar  8 15:32:18 2001
@@ -871,7 +871,7 @@ xcalloc (nelem, elsize)
   if (nelem == 0 || elsize == 0)
     nelem = elsize = 1;
 
-  newmem = calloc (nelem, elsize);
+  newmem = really_call_calloc (nelem, elsize);
   if (!newmem)
     fatal ("virtual memory exhausted");
   return (newmem);
@@ -884,9 +884,9 @@ xrealloc (old, size)
 {
   register PTR ptr;
   if (old)
-    ptr = (PTR) realloc (old, size);
+    ptr = (PTR) really_call_realloc (old, size);
   else
-    ptr = (PTR) malloc (size);
+    ptr = (PTR) really_call_malloc (size);
   if (!ptr)
     fatal ("virtual memory exhausted");
   return ptr;
@@ -896,7 +896,7 @@ PTR
 xmalloc (size)
   size_t size;
 {
-  register PTR val = (PTR) malloc (size);
+  register PTR val = (PTR) really_call_malloc (size);
 
   if (val == 0)
     fatal ("virtual memory exhausted");
diff -rup orig/egcs-CVS20010307/gcc/stmt.c egcs-CVS20010307/gcc/stmt.c
--- orig/egcs-CVS20010307/gcc/stmt.c	Tue Feb 20 13:22:27 2001
+++ egcs-CVS20010307/gcc/stmt.c	Thu Mar  8 15:38:52 2001
@@ -5193,7 +5193,8 @@ check_for_full_enumeration_handling (typ
       /* We deliberately use calloc here, not cmalloc, so that we can suppress
 	 this optimization if we don't have enough memory rather than
 	 aborting, as xmalloc would do.  */
-      && (cases_seen = (unsigned char *) calloc (bytes_needed, 1)) != NULL)
+      && (cases_seen =
+	  (unsigned char *) really_call_calloc (bytes_needed, 1)) != NULL)
     {
       HOST_WIDE_INT i;
       tree v = TYPE_VALUES (type);
diff -rup orig/egcs-CVS20010307/gcc/system.h egcs-CVS20010307/gcc/system.h
--- orig/egcs-CVS20010307/gcc/system.h	Tue Mar  6 08:41:35 2001
+++ egcs-CVS20010307/gcc/system.h	Thu Mar  8 16:12:49 2001
@@ -577,4 +577,29 @@ typedef char _Bool;
 #define TRUE true
 #define FALSE false
 
+/* As the last action in this file, we poison the identifiers that
+   shouldn't be used.  Note, luckily gcc-3.0's token-based integrated
+   preprocessor won't trip on poisoned identifiers that arrive from
+   the expansion of macros.  E.g. #define strrchr rindex, won't error
+   if rindex is poisoned after this directive is issued and later on
+   strrchr is called.
+
+   Note: We define bypass macros for the few cases where we really
+   want to use the libc memory allocation routines.  Otherwise we
+   insist you use the "x" versions from libiberty.  */
+
+#define really_call_malloc malloc
+#define really_call_calloc calloc
+#define really_call_realloc realloc
+
+#if (GCC_VERSION >= 3000)
+
+ #pragma GCC poison malloc realloc calloc strdup
+
+/* Note: not all uses of `bcopy' and `index' (esp. variable names)
+   have been eliminated.  */
+ #pragma GCC poison bzero bcmp rindex
+
+#endif /* GCC >= 3.0 */
+
 #endif /* __GCC_SYSTEM_H__ */


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]