On 2/17/20 4:53 AM, Bruno Haible wrote:
> Paul Eggert wrote:
>> if GCC generated warnings for that sort of thing, the warnings would be false
>> alarms.
>
> Yes, and this in turn means that the ability to produce useful warnings via
> 'restrict' is limited. In this example:
> ===================================================================
> #include <string.h>
> extern void memmcpy (void *restrict, const void *restrict, size_t);
>
> void shuffle (char array[10])
> {
> memmcpy (array + 2, array, 8);
> memcpy (array + 2, array, 8);
> }
> ===================================================================
> gcc gives no warning about 'memmcpy' - because it does not know
> how many elements the function will access. gcc does give a warning
> about 'memcpy' - apparently due to custom logic in the compiler.
The following gives you a warning, with -O2 / -O3 and -Wall:
===================================================================
#include <string.h>
void memmcpy (void *restrict d, void *restrict s, size_t n)
{
memcpy(d, s, n);
}
void shuffle ()
{
char array[] = "abcdefg", *array2 = array + 2;
memmcpy (array, array2 - 2, 8);
}
===================================================================
$ gcc-8 -O2 -Wall x.c
In function ‘memmcpy’,
inlined from ‘shuffle’ at x.c:11:3:
x.c:4:3: warning: ‘memcpy’ accessing 8 bytes at offsets 0 and 0 overlaps
8 bytes at offset 0 [-Wrestrict]
memcpy(d, s, n);
^~~~~~~~~~~~~~~
Regards, Tim
signature.asc
Description: OpenPGP digital signature
