From nobody Sun Feb 8 01:30:30 2026 Received: from mail-wr1-f46.google.com (mail-wr1-f46.google.com [209.85.221.46]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 583A8326944 for ; Tue, 3 Feb 2026 10:30:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770114619; cv=none; b=c5o/2VERSTsbStnp7GUQAtE8D4G9YVp5LQJ7ACAyNMXKJe/43B5GenFp5pIgcE0fpYdllgjHSOd2SnYaWva/j0kFc3jRvORDXbRaeYaLiNCUIElcRJElBxeRC+VwV6RdiZrZktMSbRLeHy5HuMhc4jhV4f5gKHljrmAKAZc7ZUo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770114619; c=relaxed/simple; bh=Nb6SGradxm+Xw60Yibm6ldNdCRfsd4JckIeme/aDbJ4=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=r6NtC4P7ECZ7OsYAA1Qwa4/QEGJpgRc3eLhdBbDwhNYLGeeOTXkAVDrZjZ4ebxhqjDLslVhXXf9sHEY3boBBDSCRT8j3xI3GOSrA5MyXEmFYYhDcIF8PHROcIfZQKMWdCur8ih5J7ptF/mnUeouIwrrxrrBF+226DXVrd764HFY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=KxQcnMrz; arc=none smtp.client-ip=209.85.221.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="KxQcnMrz" Received: by mail-wr1-f46.google.com with SMTP id ffacd0b85a97d-43590777e22so3386912f8f.3 for ; Tue, 03 Feb 2026 02:30:17 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1770114616; x=1770719416; darn=vger.kernel.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; bh=Q4cr5VXld/nVdCeB0tYPtpicTkNHYMBhdh7AGuddQzc=; b=KxQcnMrzQd65UGMo00GS2RVyPCwpeUkdQpXKSahS+LYya6Hk8oJkBUbxzcFgZnzNTa qwnGN7hW1zJ7LbMrSTGKBonvP5Hh8sbgl662dhWEYrmiWjGJEeI3whWtqFWLfrVQWJ65 h0mJHpqWXvSIJO6Gi04MYkqCVL/NmWmjcAHDjt5OApFquERUVW0T0zA4M6ktj87Xq1vk GrPfiB9FQ6DeV3y4QbY1vo5VlBqnANq7h08Bk0kE1yenZOvRN0mXlHqnFnxA5ojXdXI7 LSJ3w1lN57NTWia8du8hR1Ras3uyyv5e46G47GoarLdAUQ1ztkAGAWNn11cy0b7RULh7 JEmA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770114616; x=1770719416; 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; bh=Q4cr5VXld/nVdCeB0tYPtpicTkNHYMBhdh7AGuddQzc=; b=tcMXnSSzDeOphOC/qSqE7nTfhyooNwDfc/IOp1zaE+72d/J+8UHEiPdbbGcSahjpKx YrEUaD2T6F8E2yxKv40z6ggyNvxBfy7tF1JCUDz8KPm5bv0VXkOC6OoGndsDvGorJPD6 IR7TVPWhTkebWWBWMxlDnBnX7R+BCQp1mmzQJJN84fSFvAler5SjrnxSS+YnLVDrwE9S WXFBrwvOANfgaVMwRMFEbf6TGUaU750tZIyogbVgn5MQiARYvZuj93MxUEJvSZ+fQ09O SDLFk4qHWkNaZFYYeBLWBcwWGlifkeoq3XPtxYcrp2uWOKV6nt/vX1wnWyd2ef5GUBMg aUOQ== X-Forwarded-Encrypted: i=1; AJvYcCW/yeh/6m5QyaQhoNYi9wRQNPpHAb4IrPejA/Ujb1h55iIj0v1drgqxwcrylkfwleWAqrD/2xwEQB1qAfA=@vger.kernel.org X-Gm-Message-State: AOJu0YyrUj0F08f/uKnG1/3O3E3qGZ56kWOhpmXx+xjF40MMYH1e8QEc knQ+dAvNo7nz1pnq83qFIglsyrubA/Fe8ytIc3Xipde+anClACTQDMyK X-Gm-Gg: AZuq6aIKNkYEGjf8XejdCZQl9neCQnzpgj1taZmX9MK5DL783LDSt0Y1iqmoW6ltzA7 MkpjPSp8az67YkUK/LayxdD1W+upKmhKZaV0nIX1lmKN7MG021cNOtDVbghGlm9k6aAVT/dWO1Q Iffdp/q77ZNmuu/6hqBnXbl05CagLrY0Vgix+6Ia8aCzzDDuBK9T6pAIkizUPP3y36KPkvlEEpO yQgXEsHXimSdRf/XGENGXcI9fMHhodY3MRLZzEDtlv8SEWbGJSom5Xh5Z5iaKolPsJBlaBe7z38 sNoyFym81phF00FG6uzkns3uDZyuNesiGjHhsurFJzX/s7pCS60V5BXwpcLCXMhNFZi5Ey6Yc83 QwFzaishdWFe4GDe79B7opHEP7N4SbnGEvnn41CoJE4tdPDozYFqB/TFE91PAJOQK0D4Dvhcqrf UMK5V0wJxbSo83IKLCbVeoEoOkGR+D2ivnAJgLxSEvNwCQ9PnS4u+P4DKZ2ctNZcbfI3RXCzRN X-Received: by 2002:a05:6000:200e:b0:431:8f8:7f1a with SMTP id ffacd0b85a97d-435f3aa90a1mr22186011f8f.31.1770114615515; Tue, 03 Feb 2026 02:30:15 -0800 (PST) Received: from snowdrop.snailnet.com (82-69-66-36.dsl.in-addr.zen.co.uk. [82.69.66.36]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-435e10edf62sm55940729f8f.13.2026.02.03.02.30.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 03 Feb 2026 02:30:15 -0800 (PST) From: david.laight.linux@gmail.com To: Willy Tarreau , =?UTF-8?q?Thomas=20Wei=C3=9Fschuh?= , linux-kernel@vger.kernel.org, Cheng Li Cc: David Laight Subject: [PATCH 11/12] selftests/nolibc: Increase coverage of printf format tests Date: Tue, 3 Feb 2026 10:29:59 +0000 Message-Id: <20260203103000.20206-12-david.laight.linux@gmail.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20260203103000.20206-1-david.laight.linux@gmail.com> References: <20260203103000.20206-1-david.laight.linux@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: David Laight Extra tests include: - %%, including ignored modifiers. - Invalid formats copied to output buffer (matches glibc). - Left aligned output "%-..." - Zero padding "%0...". - "(nil)" for NULL pointers (matches glibc). - Alternate form "%#x" (prepends 0x in non-zero). - Field precision as well as width, printf("%.0d", 0) is "". - Variable length width and precision "%*.*d". - Length qualifiers L and ll. - Conversion specifiers i and X. - More 'corner' cases. There are no explicit tests of long (l, t or z) because they would have to differ between 32bit and 64bit. Set the expected length to zero for all the non-truncating tests. (Annoying when a test is changed.) Signed-off-by: David Laight --- tools/testing/selftests/nolibc/nolibc-test.c | 48 +++++++++++++++----- 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/tools/testing/selftests/nolibc/nolibc-test.c b/tools/testing/s= elftests/nolibc/nolibc-test.c index 9378a1f26c34..bf92b9046175 100644 --- a/tools/testing/selftests/nolibc/nolibc-test.c +++ b/tools/testing/selftests/nolibc/nolibc-test.c @@ -1565,6 +1565,7 @@ int run_stdlib(int min, int max) #define EXPECT_VFPRINTF(c, expected, fmt, ...) \ ret +=3D expect_vfprintf(llen, c, expected, fmt, ##__VA_ARGS__) =20 +__attribute__((mat(printf, 3, 0))) static int expect_vfprintf(int llen, int c, const char *expected, const ch= ar *fmt, ...) { unsigned int i; @@ -1727,20 +1728,43 @@ static int run_printf(int min, int max) */ switch (test + __LINE__ + 1) { CASE_TEST(empty); EXPECT_VFPRINTF(0, "", ""); break; - CASE_TEST(simple); EXPECT_VFPRINTF(3, "foo", "foo"); break; - CASE_TEST(string); EXPECT_VFPRINTF(3, "foo", "%s", "foo"); break; - CASE_TEST(number); EXPECT_VFPRINTF(4, "1234", "%d", 1234); break; - CASE_TEST(negnumber); EXPECT_VFPRINTF(5, "-1234", "%d", -1234); break; - CASE_TEST(unsigned); EXPECT_VFPRINTF(5, "12345", "%u", 12345); break; - CASE_TEST(char); EXPECT_VFPRINTF(1, "c", "%c", 'c'); break; - CASE_TEST(hex); EXPECT_VFPRINTF(1, "f", "%x", 0xf); break; - CASE_TEST(pointer); EXPECT_VFPRINTF(3, "0x1", "%p", (void *) 0x1); = break; - CASE_TEST(uintmax_t); EXPECT_VFPRINTF(20, "18446744073709551615", "%j= u", 0xffffffffffffffffULL); break; - CASE_TEST(intmax_t); EXPECT_VFPRINTF(20, "-9223372036854775807", "%j= d", 0x8000000000000001LL); break; + CASE_TEST(simple); EXPECT_VFPRINTF(0, "foo", "foo"); break; + CASE_TEST(string); EXPECT_VFPRINTF(0, "foo", "%s", "foo"); break; + CASE_TEST(number); EXPECT_VFPRINTF(0, "1234", "%d", 1234); break; + CASE_TEST(negnumber); EXPECT_VFPRINTF(0, "-1234", "%d", -1234); break; + CASE_TEST(unsigned); EXPECT_VFPRINTF(0, "12345", "%u", 12345); break; + CASE_TEST(signed_max); EXPECT_VFPRINTF(0, "2147483647", "%i", ~0u >> 1= ); break; + CASE_TEST(signed_min); EXPECT_VFPRINTF(0, "-2147483648", "%i", (~0u >>= 1) + 1); break; + CASE_TEST(unsigned_max); EXPECT_VFPRINTF(0, "4294967295", "%u", ~0u); br= eak; + CASE_TEST(char); EXPECT_VFPRINTF(0, "|c|d| e|", "|%c|%.0c|%4c|= ", 'c', 'd', 'e'); break; + CASE_TEST(hex); EXPECT_VFPRINTF(0, "|f|d|", "|%x|%X|", 0xf, 0xd= ); break; + CASE_TEST(pointer); EXPECT_VFPRINTF(0, "0x1", "%p", (void *) 0x1); = break; + CASE_TEST(pointer_NULL); EXPECT_VFPRINTF(0, "|(nil)|(nil)|", "|%p|%.4p|"= , (void *)0, (void *)0); break; + CASE_TEST(string_NULL); EXPECT_VFPRINTF(0, "|(null)||(null)|", "|%s|%.5= s|%.6s|", (void *)0, (void *)0, (void *)0); break; + CASE_TEST(percent); EXPECT_VFPRINTF(0, "a%d42%69%", "a%%d%d%%%d%%",= 42, 69); break; + CASE_TEST(perc_qual); EXPECT_VFPRINTF(0, "a%d2", "a%-14l%d%d", 2); br= eak; + CASE_TEST(invalid); EXPECT_VFPRINTF(0, "a%12yx3%y42%y", "a%12yx%d%y= %d%y", 3, 42); break; + CASE_TEST(intmax_max); EXPECT_VFPRINTF(0, "9223372036854775807", "%lld= ", ~0ULL >> 1); break; + CASE_TEST(intmax_min); EXPECT_VFPRINTF(0, "-9223372036854775808", "%Li= ", (~0ULL >> 1) + 1); break; + CASE_TEST(uintmax_max); EXPECT_VFPRINTF(0, "18446744073709551615", "%ju= ", ~0ULL); break; CASE_TEST(truncation); EXPECT_VFPRINTF(25, "01234567890123456789", "%s= ", "0123456789012345678901234"); break; - CASE_TEST(string_width); EXPECT_VFPRINTF(10, " 1", "%10s", "1");= break; - CASE_TEST(number_width); EXPECT_VFPRINTF(10, " 1", "%10d", 1); b= reak; + CASE_TEST(string_width); EXPECT_VFPRINTF(0, " 1", "%10s", "1"); = break; + CASE_TEST(string_trunc); EXPECT_VFPRINTF(0, " 12345", "%10.5s", "123= 4567890"); break; + CASE_TEST(number_width); EXPECT_VFPRINTF(0, " 1", "%10d", 1); br= eak; + CASE_TEST(number_left); EXPECT_VFPRINTF(0, "|-5 |", "|%-8d|", -5);= break; + CASE_TEST(string_align); EXPECT_VFPRINTF(0, "|foo |", "|%-8s|", "foo= "); break; CASE_TEST(width_trunc); EXPECT_VFPRINTF(25, " ", "%2= 5d", 1); break; + CASE_TEST(width_tr_lft); EXPECT_VFPRINTF(25, "1 ", "%-= 25d", 1); break; + CASE_TEST(number_pad); EXPECT_VFPRINTF(0, "0000000005", "%010d", 5); b= reak; + CASE_TEST(num_pad_neg); EXPECT_VFPRINTF(0, "-000000005", "%010d", -5); = break; + CASE_TEST(num_pad_hex); EXPECT_VFPRINTF(0, "00fffffffb", "%010x", -5); = break; + CASE_TEST(number_prec); EXPECT_VFPRINTF(0, " 00005", "%10.5d", 5); = break; + CASE_TEST(num_prec_neg); EXPECT_VFPRINTF(0, " -00005", "%10.5d", -5);= break; + CASE_TEST(num_prec_var); EXPECT_VFPRINTF(0, " -00005", "%*.*d", 10, 5= , -5); break; + CASE_TEST(num_0_prec_0); EXPECT_VFPRINTF(0, "|| |+||||", "|%.0d|% .0d|%+= .0d|%.0u|%.0x|%#.0x|", 0, 0, 0, 0, 0, 0); break; + CASE_TEST(hex_alt); EXPECT_VFPRINTF(0, "|0x1|0x01| 0x02|", "|%#x|%#= 04x|%#5.2x|", 1, 1, 2); break; + CASE_TEST(hex_0_alt); EXPECT_VFPRINTF(0, "|0|0000| 00|", "|%#x|%#04= x|%#5.2x|", 0, 0, 0); break; + CASE_TEST(dec_alt); EXPECT_VFPRINTF(0, "|1|0001| 02|", "|%#d|%#04= d|%#5.2d|", 1, 1, 2); break; /* '#' is ignored */ CASE_TEST(scanf); EXPECT_ZR(1, test_scanf()); break; CASE_TEST(strerror); EXPECT_ZR(1, test_strerror()); break; CASE_TEST(printf_error); EXPECT_ZR(1, test_printf_error()); break; --=20 2.39.5