From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server-vie001.gnuweeb.org X-Spam-Level: ** X-Spam-Status: No, score=2.5 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,RDNS_NONE,SPF_PASS autolearn=no autolearn_force=no version=3.4.6 Authentication-Results: server-vie001.gnuweeb.org; dkim=pass (2048-bit key; unprotected) header.d=openresty.com header.i=@openresty.com header.a=rsa-sha256 header.s=google header.b=HzZJm0TZ; dkim-atps=neutral Received: by server-vie001.gnuweeb.org (Postfix, from userid 1000) id A7E8F2DEF4B6; Sun, 26 Jul 2026 10:13:41 +0000 (UTC) Authentication-Results: server-vie001.gnuweeb.org; dmarc=none (p=none dis=none) header.from=openresty.com Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=2607:f8b0:4864:20::432; helo=mail-pf1-x432.google.com; envelope-from=ammarfaizi2@openresty.com; receiver= Received: from mail-pf1-x432.google.com (unknown [IPv6:2607:f8b0:4864:20::432]) by server-vie001.gnuweeb.org (Postfix) with ESMTPS id F3A982DEF464 for ; Sun, 26 Jul 2026 10:13:30 +0000 (UTC) Received: by mail-pf1-x432.google.com with SMTP id d2e1a72fcca58-84536ecfc5bso2087323b3a.2 for ; Sun, 26 Jul 2026 03:13:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openresty.com; s=google; t=1785060807; x=1785665607; darn=gnuweeb.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=DFzxRl2W6j8iJng14jgnrShRQTusWOg9FAzc5E6yZYg=; b=HzZJm0TZBQJuTxVJCCwSpWwoo5h3TKOc8FWhygnTyX8x+eup/gEd+/d7KiiZXkVLpm uXloOWPli4kBcfLGHChsGsqrJjZqDLa1bOTnmuEQH3cNQB7th1bJ1QbhuBrn1Wm35bUy 97M26q2/dOqe7eT77PIq4Td2i6S5gTZhxfBPlVHZoHPL25o1fvsHftaPezW1MbKnDGwu NNyGaNGPtsMiOXtWq3bhSnoDO8rvQPykwzg0SdByzHMYFiENCflHDBjalAVM8O2+LYtN yvnfp3yN9vS+wG1y6oufS13T4v7WL9gD4QODK+Z/4JntTOrmzlVqTxqh4+YeaWbatm2R gvEA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785060807; x=1785665607; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=DFzxRl2W6j8iJng14jgnrShRQTusWOg9FAzc5E6yZYg=; b=f5QeQ4YWVAFuAaG6tjNksOPYK5cXBVARle3tEh8RqN58NqAf73xNvGkrYx5SAzvak8 /5Av8/0QJFATHC5fvA2Gfm1RHUZPJRFp5GfSEgCO06laL2ubj298uTkjrfJs1TiCLF88 fFSzA3WCNOHwGKIMeSurcBqyHl8lL5h5pmwMYuUVIXFAM9H0j0/+Xrnq8BvBVB+SAJP6 sjvAOZUfuGurJK4guEz9kw8aDEn01EAjJ4mhDC2nbO6efGu+12FU4WoTKZ8En/+URmB0 AjYkK5fgladwQ+tnHE0QJp0Fgyuissp1hStYmtVE1WpxpTIlpr6FnP7AV6igsRX6LHOk ksrQ== X-Forwarded-Encrypted: i=1; AHgh+Roz2Z/gXqtnNs3q1SrND7elUa2Myot+pah4Sd825UGss4VOFrKv+BxCIvj829muRNhz9qge@gnuweeb.org X-Gm-Message-State: AOJu0YyUp/qRI6WFQybNEccDi2HAsXjrz/uUbQJwVJT3F+fUC+iYB1o3 UbmetNyUJJRKLO2+sVxhhwGqR3YwwFi03M7UeOfIvCGJrwi5eokbiiEePlHBWu2rrUE= X-Gm-Gg: AR+sD13XaB+s+r90yDSkiD0F9a5j3DczCHcvofDwlFH6ZHTr5Zqf9mFBuvoHHt3PyTz oURcWvNhnFPmrOOY41NcnLLiGk0eS5dWAFKomRqw7YpHS57p8boHJ5STLIOzDKxLsjNk0MRW5Pi bCpd2sD9t7yR1B6Yg1guqTVUw4jVU8OkflAff6N5aY8ReoDq4jyFjQpO1jHwpe1fCwhRK2K+41H 4nGacCCqKtrJGBRT7yv7p4HNMnTPR5VEmin4+WsK+wkJmO/WaalRpr1clU8eOe8BRHrUbqAJL4i ECX2RoHOXw0ak2FHxAFcg+iszHk6AU58PhRCalud25XvPH0GuwO550Fi0A0ZFfQlnwXToOPJtCz 6tGdDCAbX+fuBFvxNUt16zKArm5KfntZNOtsCykT/wjAHkSdLgFhCAIFTavbjVOwKoL1g12AYKd Ph2PDMIBbQbNvmew== X-Received: by 2002:a05:6a21:681:b0:3b4:75c0:3ec0 with SMTP id adf61e73a8af0-3c67daaaf88mr4403603637.30.1785060807009; Sun, 26 Jul 2026 03:13:27 -0700 (PDT) Received: from integral2.. ([2402:8780:1329:2779:9db7:a8ec:2e1c:53e1]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-314bc59e9fesm17243981eec.27.2026.07.26.03.13.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 26 Jul 2026 03:13:26 -0700 (PDT) From: Ammar Faizi To: Willy Tarreau , =?UTF-8?q?Thomas=20Wei=C3=9Fschuh?= Cc: Ammar Faizi , Linux Kernel Mailing List , Linux Kselftest Mailing List , LLVM Mailing List , Yichun Zhang , Alviro Iskandar Setiawan , Shuah Khan , Nathan Chancellor , Nick Desaulniers , Bill Wendling , Justin Stitt , gwml@gnuweeb.org Subject: [PATCH 3/4] selftests/nolibc: add abs() range test Date: Sun, 26 Jul 2026 17:13:04 +0700 Message-Id: <20260726101306.3772237-4-ammarfaizi2@openresty.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260726101306.3772237-1-ammarfaizi2@openresty.com> References: <20260726101306.3772237-1-ammarfaizi2@openresty.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: The existing abs/abs_noop cases only cover abs(-10) and abs(10), and labs() and llabs() have no coverage at all. Nothing exercises the type minimum, where negating the argument overflows. Add a case walking all three functions over the interesting points of their argument type: the minimum, the minimum plus one, an ordinary negative value, zero and the maximum. At the minimum the absolute value is not representable and the argument is returned unchanged. Both the arguments and the results have to be hidden from the optimizer. The compiler knows these functions never return a negative value, so it folds the comparisons at build time otherwise, and that would equally hide the overflow being tested for. Note that the overflow itself is only reported through the: -fsanitize=undefined -fsanitize-trap=all flags the suite already builds with; without them the wrapped result is the same as the correct one. With the flags, and with the preceding fix reverted, the run dies with SIGILL on this test on both i386 and x86-64. Cc: Alviro Iskandar Setiawan Signed-off-by: Ammar Faizi --- tools/testing/selftests/nolibc/nolibc-test.c | 47 ++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/tools/testing/selftests/nolibc/nolibc-test.c b/tools/testing/selftests/nolibc/nolibc-test.c index 996e8d13508e..4dc2ffea63bd 100644 --- a/tools/testing/selftests/nolibc/nolibc-test.c +++ b/tools/testing/selftests/nolibc/nolibc-test.c @@ -1728,6 +1728,52 @@ int test_alloca(void) return *x - 0x1234; } +/* abs(), labs() and llabs() over the whole range of their argument type */ +int test_abs_range(void) +{ + int i, ri; + long l, rl; + long long ll, rll; + + /* + * Both the inputs and the results have to stay opaque: the compiler + * knows abs() and friends never return a negative value and would + * otherwise fold the comparisons below at build time, which would also + * hide the undefined behavior that is being tested for. + */ + i = INT_MIN; l = LONG_MIN; ll = LLONG_MIN; + __asm__ ("" : "+r" (i), "+r" (l), "+r" (ll)); + ri = abs(i); rl = labs(l); rll = llabs(ll); + __asm__ ("" : "+r" (ri), "+r" (rl), "+r" (rll)); + /* the absolute value is not representable, the input is returned */ + if (ri != INT_MIN || rl != LONG_MIN || rll != LLONG_MIN) + return 1; + + i = INT_MIN + 1; l = LONG_MIN + 1; ll = LLONG_MIN + 1; + __asm__ ("" : "+r" (i), "+r" (l), "+r" (ll)); + ri = abs(i); rl = labs(l); rll = llabs(ll); + __asm__ ("" : "+r" (ri), "+r" (rl), "+r" (rll)); + if (ri != INT_MAX || rl != LONG_MAX || rll != LLONG_MAX) + return 2; + + i = -42; l = -42; ll = -42; + __asm__ ("" : "+r" (i), "+r" (l), "+r" (ll)); + if (abs(i) != 42 || labs(l) != 42 || llabs(ll) != 42) + return 3; + + i = 0; l = 0; ll = 0; + __asm__ ("" : "+r" (i), "+r" (l), "+r" (ll)); + if (abs(i) != 0 || labs(l) != 0 || llabs(ll) != 0) + return 4; + + i = INT_MAX; l = LONG_MAX; ll = LLONG_MAX; + __asm__ ("" : "+r" (i), "+r" (l), "+r" (ll)); + if (abs(i) != INT_MAX || labs(l) != LONG_MAX || llabs(ll) != LLONG_MAX) + return 5; + + return 0; +} + int test_difftime(void) { if (difftime(200., 100.) != 100.) @@ -1943,6 +1989,7 @@ int run_stdlib(int min, int max) CASE_TEST(toupper_noop); EXPECT_EQ(1, toupper('A'), 'A'); break; CASE_TEST(abs); EXPECT_EQ(1, abs(-10), 10); break; CASE_TEST(abs_noop); EXPECT_EQ(1, abs(10), 10); break; + CASE_TEST(abs_range); EXPECT_ZR(1, test_abs_range()); break; CASE_TEST(alloca); EXPECT_ZR(1, test_alloca()); break; CASE_TEST(difftime); EXPECT_ZR(1, test_difftime()); break; CASE_TEST(memchr_foobar6_o); EXPECT_STREQ(1, memchr("foobar", 'o', 6), "oobar"); break; -- Ammar Faizi