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]
