? "\0abc" : "\0xyz"

Martin v. Loewis martin@loewis.home.cs.tu-berlin.de
Thu Dec 23 14:53:00 GMT 1999


> The following code produces incorrect results under gcc 2.8.1, incorrect
> results under egcs 2.91.66, correct results under gcc 2.7.2.3, and
> _presumably_ (see below) incorrect results under the latest gcc:

Thanks for your bug report. I believe you are right, here is a patch.

The testsuite is running right now. Is it ok for the mainline, too?

Regards,
Martin

1999-12-23  Martin v. Löwis  <loewis@informatik.hu-berlin.de>

	* fold-const.c (operand_equal_p): Use memcmp to compare string
	constants.
	Suggested by D. J. Bernstein

char* doit(int flag)
{
  return 1 + (flag ? "\0wrong\n" : "\0right\n");
}
int main()
{
  char *result = doit(0);
  if (*result == 'r' && result[1] == 'i')
    exit(0);
  abort();
}

Index: fold-const.c
===================================================================
RCS file: /cvs/gcc/egcs/gcc/fold-const.c,v
retrieving revision 1.93
diff -u -r1.93 fold-const.c
--- fold-const.c	1999/12/21 06:02:59	1.93
+++ fold-const.c	1999/12/23 00:08:27
@@ -2250,7 +2250,7 @@
 
       case STRING_CST:
 	return (TREE_STRING_LENGTH (arg0) == TREE_STRING_LENGTH (arg1)
-		&& ! strncmp (TREE_STRING_POINTER (arg0),
+		&& ! memcmp (TREE_STRING_POINTER (arg0),
 			      TREE_STRING_POINTER (arg1),
 			      TREE_STRING_LENGTH (arg0)));
 


More information about the Gcc-bugs mailing list