Hi Tom,
[email protected] wrote,

> Hi,
> 
> The ARM implementation of memset has a bug when the fill-value is negative or 
> outside the [0, 255] range. To reproduce:
> 
> int main() {
>     char array[256];
>     memset(array, -5, 256);
> 
>     for (int i = 0; i < 256; ++i) {
>         printf("%d, ", (int)array[i]);
>     }
>     return 0;
> }
> 
> This is supposed to fill the array with int8 values -5, -5, -5, ... . On ARM, 
> this does not work because the implementation assumes the high bytes of the 
> fill-value argument are already zero. However in this test case they are 
> filled with 1-bits. The other implementations that I checked (aarch64 and 
> x86_64) do not have this problem: they first convert the fill-value to an 
> unsigned byte following the specification of memset.
> 
> With GCC one can use  `memset(ptr, (-5 & 0xFF), size)` as a workaround, but 
> for clang users that does not work: clang optimizes the `& 0xFF` away because 
> it assumes that memset will do it.
> 
> How to fix/patch:
> 
> In this file:  
> https://cgit.uclibc-ng.org/cgi/cgit/uclibc-ng.git/tree/libc/string/arm/memset.S
> 
> Before line 35 (lsl) insert this:    uxtb r1, r1
> Before line 71 (orr) insert this:   uxtb a2, a2

Can you provide a git format-patch for testing?
A similar bug was reported by Paul.

best regards
 Waldemar
_______________________________________________
devel mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to