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=DlCy30Vs; dkim-atps=neutral Received: by server-vie001.gnuweeb.org (Postfix, from userid 1000) id BD8A22DEF4A9; Sun, 26 Jul 2026 10:13:40 +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::102e; helo=mail-pj1-x102e.google.com; envelope-from=ammarfaizi2@openresty.com; receiver= Received: from mail-pj1-x102e.google.com (unknown [IPv6:2607:f8b0:4864:20::102e]) by server-vie001.gnuweeb.org (Postfix) with ESMTPS id 64A042DEF45E for ; Sun, 26 Jul 2026 10:13:28 +0000 (UTC) Received: by mail-pj1-x102e.google.com with SMTP id 98e67ed59e1d1-384930ca5e2so1689208a91.3 for ; Sun, 26 Jul 2026 03:13:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=openresty.com; s=google; t=1785060803; x=1785665603; 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=IzYyTqubCWXIpDP8ZIyMuH6xumXv5Qqvgs5r4fwNWNM=; b=DlCy30VsWnxICsWyRD69bFdByJ34wg5quu/bfyVF5z5HFkiKK98WwQU5bdndHSvdya +YB5tghLWHev759DClluARF0Mv8NUjHQrHvI+ExRVV0Fj8zYzHxT5PkKUg11Ne4KQD+J V0lSYn+3vd8Yobj8Fko0SdUKLg5EY3hXt/IPQGm8GxtS+aHyeIu5Jc2PoMnukMzt+Bly Q2XSu33tryhM3eqGQ7BuET2pbyWAiTywrAnZ0+q7CTSzm+jxtflh8OKU/hV7zyBftfKi VOmvQODAWffjRU+h1sSE4AFj31zMudbEPSwYgf0z+z0JAIO1Dd1xCrGY486WVbHeU67Q mKLA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785060803; x=1785665603; 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=IzYyTqubCWXIpDP8ZIyMuH6xumXv5Qqvgs5r4fwNWNM=; b=s60UkTwoovqJpQD8wAvF2GwRzMianahFmiPrch+6tgE7c3JKOgZGS51kru8tsYgThY lAOZ/Rd+eo7mh9uIbBFTu/Kvh6XMoIRmE4f9voFHQz9xjXFCo2tEFCT0IUzsiaImFr55 f/5I4UTQAXirF/qbF/Cz3q9TNH2NIqte8TBsDU0raIijnKXJ5xSCLws0I+Ysg7i2GgO2 Exrt9rY8KbhPypFgui+FmClcjknzDKVNURPBdNB7ptW6prSZ/mi1QwcvkmrIZZY+NXFS EsM7dzGzNt97rBniIWnVv6Rw+uFzVVTA3+rpALE2jlXJa2/+HaqF9JM3pHtmuILItIWw QPvA== X-Forwarded-Encrypted: i=1; AHgh+RokHk+nOFZRXiPdSNhLhk4/KYXKY1+xrT/ZURk2OeZQkK8IQnMa5fAJHNK4XhlT4TMwsC2B@gnuweeb.org X-Gm-Message-State: AOJu0YwNqAgE8dBHfcaBNbF8Sp7fOfe9FBI5R3DK90gjvRnXRsbH80kJ v47Ueavd7SyHMiEcfOi/KMjdK0x9LF0J9PXj1qPETplehjYOYh9ASN5vD1vBWP5k8zw= X-Gm-Gg: AR+sD126dm7yeoRyKucbXzdyhCAlC/Wn0jjzx6DPL695fVuAm4oYSH43XLOIvQg1wlO Sl3WINWbx4+JysqQ0Qio0GrvtEDO2xoDD5IVQvAaDyqYHRA1tYucdw1XLvsBstxHm72YbtjwK2v UI+7OmQ/GVM/6cm93ZCCBT1AccMB+VfJjB5HGArZvyZriMhyOdu7TKVmLeL5wS/VrFCqtv8Ybxm CiABlOMcT4VpHn/+ui15LFprxC5bAPonPm6E0CA1afe+qBVpJrqy+N/OxIMMlHXqQzrxlmw6Uok NzvJ8d4avQFMrbDJYOTk8wWXZ4l+p5dM+CR32i2c6OOV3SyEQfgVMlcZTJK02Pkn6lUQPlzLlZr D9hPyfS/hvLpBq9voZqFMb3MxfoOTnb6DGP31iO0CzH61J3CWvrx5nQyx+VpaJsstKngScTl5wA 4LAYJrAgG7VdvsJg== X-Received: by 2002:a17:90b:254c:b0:387:e0db:3d8d with SMTP id 98e67ed59e1d1-38f298859c2mr4688509a91.40.1785060803000; Sun, 26 Jul 2026 03:13:23 -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.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 26 Jul 2026 03:13:22 -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 2/4] tools/nolibc: stdlib: avoid signed overflow in abs() and friends Date: Sun, 26 Jul 2026 17:13:03 +0700 Message-Id: <20260726101306.3772237-3-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: Negating the smallest negative value of a signed type overflows, which is undefined behavior. The selftests are built with: -fsanitize=undefined -fsanitize-trap=all so a caller passing INT_MIN does not merely get an unspecified answer, it dies (on both x86-64 and i386): A simple test program: printf("x = %d\n", abs(INT_MIN)); $ ./ab Illegal instruction (core dumped) (gdb) bt #0 0x0000000000401009 in main () (gdb) x/6i main 0x401000
: mov $0x80000000,%eax 0x401005 : neg %eax 0x401007 : jno 0x40100b => 0x401009 : ud2 0x40100b : push %rax 0x40100c : mov $0x80000000,%esi Negate in the corresponding unsigned type instead. The value still cannot be represented in the result type, so the minimum is returned unchanged. Cc: Yichun Zhang Cc: Alviro Iskandar Setiawan Fixes: bf5e8a78bede ("tools/nolibc: add abs() and friends") Signed-off-by: Ammar Faizi --- tools/include/nolibc/stdlib.h | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/tools/include/nolibc/stdlib.h b/tools/include/nolibc/stdlib.h index 1816c2368b68..8d86044f759f 100644 --- a/tools/include/nolibc/stdlib.h +++ b/tools/include/nolibc/stdlib.h @@ -32,22 +32,28 @@ static __attribute__((unused)) char itoa_buffer[21]; * As much as possible, please keep functions alphabetically sorted. */ +/* + * The absolute value of the smallest negative value is not representable in + * the result type. Negate in the unsigned type so that the overflow is + * defined and return it unchanged, like the other libcs do. + */ + static __inline__ int abs(int j) { - return j >= 0 ? j : -j; + return j >= 0 ? j : (int)-(unsigned int)j; } static __inline__ long labs(long j) { - return j >= 0 ? j : -j; + return j >= 0 ? j : (long)-(unsigned long)j; } static __inline__ long long llabs(long long j) { - return j >= 0 ? j : -j; + return j >= 0 ? j : (long long)-(unsigned long long)j; } /* must be exported, as it's used by libgcc for various divide functions */ -- Ammar Faizi