diff --git a/lib/string.c b/lib/string.c index 4fb566ea610ffd..1718f96e8082de 100644 --- a/lib/string.c +++ b/lib/string.c @@ -880,3 +880,30 @@ void *memchr_inv(const void *start, int c, size_t bytes) return check_bytes8(start, value, bytes % 8); } EXPORT_SYMBOL(memchr_inv); + +static int sign(int x) +{ + return (x > 0) - (x < 0); +} + +static int test_xxxcmp(void) +{ + char a[2], b[2]; + int i, j; + + a[1] = b[1] = 0; + for (i = 0; i < 256; ++i) { + a[0] = i; + for (j = 0; j < 256; ++j) { + b[0] = j; + WARN_ONCE(sign(strcmp(a, b)) != sign(i - j), + "strcmp() broken for (%2ph, %2ph)\n", a, b); + WARN_ONCE(sign(memcmp(a, b, 2)) != sign(i - j), + "memcmp() broken for (%2ph, %2ph)\n", a, b); + WARN_ONCE(sign(strncmp(a, b, 2)) != sign(i - j), + "strncmp() broken for (%2ph, %2ph)\n", a, b); + } + } + return 0; +} +late_initcall(test_xxxcmp);