summaryrefslogtreecommitdiff
path: root/src/string/memmove.c
AgeCommit message (Collapse)AuthorLines
2018-09-26fix aliasing-based undefined behavior in string functionsRich Felker-1/+7
use the GNU C may_alias attribute if available, and fallback to naive byte-by-byte loops if __GNUC__ is not defined. this patch has been written to minimize changes so that history remains reviewable; it does not attempt to bring the affected code into a more consistent or elegant form.
2018-09-23fix undefined pointer comparison in memmoveRich Felker-1/+1
the comparison must take place in the address space model as an integer type, since comparing pointers that are not pointing into the same array is undefined. the subsequent d<s comparison however is valid, because it's only reached in the case where the source and dest overlap, in which case they are necessarily pointing to parts of the same array. to make the comparison, use an unsigned range check for dist(s,d)>=n, algebraically !(-n<s-d<n). subtracting n yields !(-2*n<s-d-n<0), which mapped into unsigned modular arithmetic is !(-2*n<s-d-n) or rather -2*n>=s-d-n.
2012-09-10reenable word-at-at-time copying in memmoveRich Felker-4/+27
before restrict was added, memove called memcpy for forward copies and used a byte-at-a-time loop for reverse copies. this was changed to avoid invoking UB now that memcpy has an undefined copying order, making memmove considerably slower. performance is still rather bad, so I'll be adding asm soon.
2012-09-06remove dependency of memmove on memcpy directionRich Felker-5/+4
this commit introduces a performance regression in many uses of memmove, which will need to be addressed before the next release. i'm making it as a temporary measure so that the restrict patch can be committed without invoking undefined behavior when memmove calls memcpy with overlapping regions.
2011-02-12initial check-in, version 0.5.0v0.5.0Rich Felker-0/+14