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

Best regards,
Tom
_______________________________________________
devel mailing list -- devel@uclibc-ng.org
To unsubscribe send an email to devel-le...@uclibc-ng.org

Reply via email to