On 6/17/19 11:35 AM, Jakub Jelinek wrote: > On Mon, Jun 17, 2019 at 11:26:03AM +0200, Martin Liška wrote: >> diff --git a/gcc/builtins.c b/gcc/builtins.c >> index 3463ffb1539..917852071b9 100644 >> --- a/gcc/builtins.c >> +++ b/gcc/builtins.c >> @@ -7142,6 +7142,20 @@ inline_expand_builtin_string_cmp (tree exp, rtx >> target) >> const char *src_str1 = c_getstr (arg1, &len1); >> const char *src_str2 = c_getstr (arg2, &len2); >> >> + if (src_str1 != NULL) >> + { >> + unsigned HOST_WIDE_INT str_str1_strlen = strlen (src_str1); >> + if (str_str1_strlen + 1 < len1) >> + len1 = str_str1_strlen + 1; > > So use strnlen instead of strlen? > if (src_str1 != NULL) > len1 = strnlen (src_str1, len1); > etc.?
Sure, done in attached patch. Patch can bootstrap on x86_64-linux-gnu and survives regression tests. Ready to be installed? Thanks, Martin > > Jakub >
>From d3bb4fc58dc92057bdb3e0921d6c0ffce1e8d732 Mon Sep 17 00:00:00 2001 From: Martin Liska <mli...@suse.cz> Date: Mon, 17 Jun 2019 10:39:15 +0200 Subject: [PATCH] Handle '\0' in strcmp in RTL expansion (PR tree-optimization/90892). gcc/ChangeLog: 2019-06-17 Martin Liska <mli...@suse.cz> PR tree-optimization/90892 * builtins.c (inline_expand_builtin_string_cmp): Handle '\0' in string constants. gcc/testsuite/ChangeLog: 2019-06-17 Martin Liska <mli...@suse.cz> PR tree-optimization/90892 * gcc.dg/pr90892.c: New test. --- gcc/builtins.c | 14 ++++++++++++++ gcc/testsuite/gcc.dg/pr90892.c | 14 ++++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/pr90892.c diff --git a/gcc/builtins.c b/gcc/builtins.c index 3463ffb1539..b58e1e58d4d 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -7142,6 +7142,20 @@ inline_expand_builtin_string_cmp (tree exp, rtx target) const char *src_str1 = c_getstr (arg1, &len1); const char *src_str2 = c_getstr (arg2, &len2); + if (src_str1 != NULL) + { + unsigned HOST_WIDE_INT str_str1_strlen = strnlen (src_str1, len1); + if (str_str1_strlen + 1 < len1) + len1 = str_str1_strlen + 1; + } + + if (src_str2 != NULL) + { + unsigned HOST_WIDE_INT str_str2_strlen = strnlen (src_str2, len2); + if (str_str2_strlen + 1 < len2) + len2 = str_str2_strlen + 1; + } + /* If neither strings is constant string, the call is not qualify. */ if (!src_str1 && !src_str2) return NULL_RTX; diff --git a/gcc/testsuite/gcc.dg/pr90892.c b/gcc/testsuite/gcc.dg/pr90892.c new file mode 100644 index 00000000000..e4b5310807a --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr90892.c @@ -0,0 +1,14 @@ +/* PR tree-optimization/90892 */ +/* { dg-do run } */ +/* { dg-options "-O2" } */ + +const char *a = "A\0b"; + +int +main() +{ + if (__builtin_strncmp(a, "A\0", 2) != 0) + __builtin_abort (); + + return 0; +} -- 2.21.0