diff -ur gcc-2.95.2/gcc/c-typeck.c working-2.95.2/gcc/c-typeck.c
--- gcc-2.95.2/gcc/c-typeck.c	Thu Sep 16 14:17:51 1999
+++ working-2.95.2/gcc/c-typeck.c	Fri Oct  6 18:31:54 2000
@@ -1568,6 +1638,30 @@
   /* fntype now gets the type of function pointed to.  */
   fntype = TREE_TYPE (fntype);
 
+  /* Do this check even if they are using their own memset */
+  if (!flag_no_builtin && name
+      && IDENTIFIER_LENGTH (name) == 6
+      && strcmp (IDENTIFIER_POINTER (name), "memset") == 0)
+    {
+      tree arg1, arg2, arg3;
+
+      if ((arg1 = params)
+	  && (arg2 = TREE_CHAIN(arg1))
+	  && (arg3 = TREE_CHAIN(arg2)))
+	{
+	  /* If arg2 is sizeof-derived and arg3 isn't always warn. */
+	  if (TREE_WAS_SIZEOF (TREE_VALUE (arg2))
+	      && !TREE_WAS_SIZEOF (TREE_VALUE (arg3)))
+	    warning ("memset arguments 2 and 3 probably reversed");
+	  else /* Try harder for common `memset(ptr, len, 0)' mistake. */
+	    if (TREE_CODE (TREE_VALUE (arg3)) == INTEGER_CST
+		&& TREE_INT_CST_LOW (TREE_VALUE (arg3)) == 0
+		&& TREE_INT_CST_HIGH (TREE_VALUE (arg3)) == 0
+		&& (TREE_INT_CST_LOW (TREE_VALUE (arg2)) != 0
+		    || TREE_INT_CST_HIGH (TREE_VALUE (arg2)) != 0))
+	      warning ("memset called with zero length");
+	}
+    }
   /* Convert the parameters to the types declared in the
      function prototype, or apply default promotions.  */
 
diff -ur gcc-2.95.2/gcc/flags.h working-2.95.2/gcc/flags.h
--- gcc-2.95.2/gcc/flags.h	Tue May 18 11:05:04 1999
+++ working-2.95.2/gcc/flags.h	Fri Oct  6 18:02:23 2000
@@ -538,3 +538,7 @@
    string identifying the compiler.  */
 
 extern int flag_no_ident;
+
+/* Nonzero means don't recognize any builtin functions.  */
+
+extern int flag_no_builtin;
diff -ur gcc-2.95.2/gcc/tree.c working-2.95.2/gcc/tree.c
--- gcc-2.95.2/gcc/tree.c	Mon Aug  2 15:07:23 1999
+++ working-2.95.2/gcc/tree.c	Fri Oct  6 01:06:41 2000
@@ -3026,6 +3026,8 @@
 	TREE_SIDE_EFFECTS (t) = 1;
       TREE_RAISES (t)
 	= (arg0 && TREE_RAISES (arg0)) || (arg1 && TREE_RAISES (arg1));
+      TREE_WAS_SIZEOF (t)
+	= (arg0 && TREE_WAS_SIZEOF (arg0)) || (arg1 && TREE_WAS_SIZEOF (arg1));
     }
   else if (length == 1)
     {
@@ -3038,6 +3040,7 @@
       if (arg0 && TREE_SIDE_EFFECTS (arg0))
 	TREE_SIDE_EFFECTS (t) = 1;
       TREE_RAISES (t) = (arg0 && TREE_RAISES (arg0));
+      TREE_WAS_SIZEOF (t) = (arg0 && TREE_WAS_SIZEOF (arg0));
     }
   else
     {
@@ -3051,6 +3054,8 @@
 		TREE_SIDE_EFFECTS (t) = 1;
 	      if (TREE_RAISES (operand))
 		TREE_RAISES (t) = 1;
+	      if (TREE_WAS_SIZEOF (operand))
+		TREE_WAS_SIZEOF (t) = 1;
 	    }
 	}
     }
@@ -3105,6 +3110,8 @@
 	TREE_SIDE_EFFECTS (t) = 1;
       if (TREE_RAISES (node))
 	TREE_RAISES (t) = 1;
+      if (TREE_WAS_SIZEOF (node))
+	TREE_WAS_SIZEOF (node) = 1;
     }
 
   return t;
--- gcc-2.95.2/gcc/tree.h	Mon May  3 03:43:32 1999
+++ working-2.95.2/gcc/tree.h	Fri Oct  6 19:05:36 2000
@@ -181,6 +181,7 @@
   unsigned public_flag : 1;
   unsigned private_flag : 1;
   unsigned protected_flag : 1;
+  unsigned size_type_flag : 1;
 
   unsigned lang_flag_0 : 1;
   unsigned lang_flag_1 : 1;
@@ -189,7 +190,7 @@
   unsigned lang_flag_4 : 1;
   unsigned lang_flag_5 : 1;
   unsigned lang_flag_6 : 1;
-  /* There is room for three more flags.  */
+  /* There is room for two more flags.  */
 };
 
 /* The following table lists the uses of each of the above flags and
@@ -538,6 +539,9 @@
    In a BLOCK node, this is BLOCK_HANDLER_BLOCK.  */
 #define TREE_PROTECTED(NODE) ((NODE)->common.protected_flag)
 
+/* A sizeof()-derived expression, to check memset args */
+#define TREE_WAS_SIZEOF(NODE) ((NODE)->common.size_type_flag)
+
 /* These flags are available for each language front end to use internally.  */
 #define TREE_LANG_FLAG_0(NODE) ((NODE)->common.lang_flag_0)
 #define TREE_LANG_FLAG_1(NODE) ((NODE)->common.lang_flag_1)
--- gcc-2.95.2/gcc/c-parse.in	Tue Apr 27 08:35:50 1999
+++ working-2.95.2/gcc/c-parse.in	Sat Oct  7 00:27:10 2000
@@ -486,10 +486,12 @@
 		  if (TREE_CODE ($2) == COMPONENT_REF
 		      && DECL_C_BIT_FIELD (TREE_OPERAND ($2, 1)))
 		    error ("`sizeof' applied to a bit-field");
-		  $$ = c_sizeof (TREE_TYPE ($2)); }
+		  $$ = c_sizeof (TREE_TYPE ($2));
+		  TREE_WAS_SIZEOF ($$) = 1; }
 	| sizeof '(' typename ')'  %prec HYPERUNARY
 		{ skip_evaluation--;
-		  $$ = c_sizeof (groktypename ($3)); }
+		  $$ = c_sizeof (groktypename ($3));
+		  TREE_WAS_SIZEOF ($$) = 1; }
 	| alignof unary_expr  %prec UNARY
 		{ skip_evaluation--;
 		  $$ = c_alignof_expr ($2); }
