libc: Have memcmp test what the standard requires
libc's C memcmp currently returns the difference in byte values rather than just -1/0/1 as the AArch64 assembly implementation, many non- FreeBSD implementations, and compiler built-in optimizations do. It is a bug for a user to expect memcmp to return the difference in the byte values as the compiler is free to inline memcmp() with an implementation that does not do this. Change the test to validate only what the standard requires. PR: 289084 Reviewed by: markj, fuz Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D52502
This commit is contained in:
@@ -41,14 +41,14 @@
|
||||
#endif
|
||||
|
||||
/*
|
||||
* On FreeBSD we demand that memcmp returns the difference between the
|
||||
* characters at the first site of mismatch. However, ISO/IEC 9899:1990
|
||||
* only specifies that a number greater than, equal to, or less than
|
||||
* zero shall be returned. If a unit test for this less strict
|
||||
* behaviour is desired, define RES(x) to be (((x) > 0) - ((x) < 0)).
|
||||
* On FreeBSD we previously demanded that memcmp returns the difference
|
||||
* between the characters at the first site of mismatch. However,
|
||||
* ISO/IEC 9899:1990 only specifies that a number greater than, equal
|
||||
* to, or less than zero shall be returned. If a unit test for the
|
||||
* more strict behaviour is desired, define RES(x) to be (x).
|
||||
*/
|
||||
#ifndef RES
|
||||
#define RES(x) (x)
|
||||
#define RES(x) (((x) > 0) - ((x) < 0))
|
||||
#endif
|
||||
|
||||
static int (*memcmp_fn)(const void *, const void *, size_t);
|
||||
|
||||
Reference in New Issue
Block a user