https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98109
Bernd Buschinski <b.buschinski at googlemail dot com> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |b.buschinski at googlemail dot
com
--- Comment #4 from Bernd Buschinski <b.buschinski at googlemail dot com> ---
I also hit this problem, but not 100% sure if this is a duplicate or not.
Because as far as I can remember it used to work with GCC-11 (can not test now
only have 12) and only started failing with GCC 12.
Can someone tell me if this should be a new bug or is just a duplicate?
Known to fail on:
- sys-devel/gcc-12.1.1_p20220625 (Gentoo)
- gcc-12.1.1-1.fc36.x86_64 12.1.1 20220507 (Red Hat 12.1.1-1) (Fedora)
- 12-20220319-1ubuntu1 (Ubuntu 22.04)
Compiler explorer: https://godbolt.org/z/rrWffMe9x
Code:
#include <stdlib.h>
extern void *my_memmem(const void *__haystack, size_t __haystacklen,
const void *__needle, size_t __needlelen)
__THROW __attribute_pure__ __nonnull ((1, 3))
__attribute__((access(__read_only__, 1, 2)))
__attribute__((access(__read_only__, 3, 4)));
#define CONTAINSCONST(_cstring, string)
\
({
\
size_t const tmp_CONST_LEN = sizeof(string) - 1;
\
((_cstring).length >= tmp_CONST_LEN &&
\
(my_memmem((_cstring).buffer, (_cstring).length, string, tmp_CONST_LEN) !=
\
NULL));
\
})
struct my_string {
unsigned char *buffer;
unsigned long long length;
};
int foo(struct my_string const *const ss) {
struct my_string const str_path = *ss;
if (CONTAINSCONST(str_path, "/") ||
CONTAINSCONST(str_path, ".abcd") ||
CONTAINSCONST(str_path, "?")) {
return 1;
}
return 0;
}
// $ gcc -std=gnu99 -Wall -Wextra -Walloc-zero -O2 -fsanitize=undefined -Werror
test2.c -S
// test2.c: In function 'foo':
// test2.c:13:7: error: argument 1 is null but the corresponding size argument
2 value is [5, 18446744073709551615] [-Werror=nonnull]
// 13 | (my_memmem((_cstring).buffer, (_cstring).length, string,
tmp_CONST_LEN) != \
// |
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// test2.c:26:7: note: in expansion of macro 'CONTAINSCONST'
// 26 | CONTAINSCONST(str_path, ".abcd") ||
// | ^~~~~~~~~~~~~
// test2.c:3:14: note: in a call to function 'my_memmem' declared with
attribute 'access (read_only, 3, 4)'
// 3 | extern void *my_memmem(const void *__haystack, size_t __haystacklen,
// | ^~~~~~~~~
// cc1: all warnings being treated as errors