test/bioprinttest.c: check the output against libc's one as well

Signed-off-by: Eugene Syromiatnikov <esyr@openssl.org>

Reviewed-by: Saša Nedvědický <sashan@openssl.org>
Reviewed-by: Neil Horman <nhorman@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/28177)
This commit is contained in:
Eugene Syromiatnikov 2025-08-05 15:27:06 +02:00 committed by Neil Horman
parent f5bb94918f
commit 8d8a8aac53
1 changed files with 77 additions and 10 deletions

View File

@ -137,13 +137,33 @@ static const z_data zu_data[] = {
static int test_zu(int i) static int test_zu(int i)
{ {
char bio_buf[80]; char bio_buf[80];
char std_buf[80];
const z_data *data = &zu_data[i]; const z_data *data = &zu_data[i];
const int exp_ret = (int) strlen(data->expected);
int bio_ret;
int std_ret;
memset(bio_buf, '@', sizeof(bio_buf)); memset(bio_buf, '@', sizeof(bio_buf));
memset(std_buf, '#', sizeof(std_buf));
BIO_snprintf(bio_buf, sizeof(bio_buf), data->format, data->value); bio_ret = BIO_snprintf(bio_buf, sizeof(bio_buf), data->format, data->value);
if (!TEST_str_eq(bio_buf, data->expected)) std_ret = snprintf(std_buf, sizeof(std_buf), data->format, data->value);
if (!TEST_str_eq(bio_buf, data->expected)
+ !TEST_int_eq(bio_ret, exp_ret))
return 0; return 0;
/*
* We treat the unexpected discrepancies with libc results as notable,
* but not fatal.
*/
if (!TEST_str_eq(bio_buf, std_buf)
+ !TEST_int_eq(bio_ret, std_ret)) {
TEST_note("Format: \"%s\"", data->format);
#if defined(OPENSSL_STRICT_LIBC_PRINTF_CHECK)
return 0;
#endif
}
return 1; return 1;
} }
@ -168,12 +188,32 @@ static int test_j(int i)
{ {
const j_data *data = &jf_data[i]; const j_data *data = &jf_data[i];
char bio_buf[80]; char bio_buf[80];
char std_buf[80];
const int exp_ret = (int) strlen(data->expected);
int bio_ret;
int std_ret;
memset(bio_buf, '@', sizeof(bio_buf)); memset(bio_buf, '@', sizeof(bio_buf));
memset(std_buf, '#', sizeof(std_buf));
BIO_snprintf(bio_buf, sizeof(bio_buf), data->format, data->value); bio_ret = BIO_snprintf(bio_buf, sizeof(bio_buf), data->format, data->value);
if (!TEST_str_eq(bio_buf, data->expected)) std_ret = snprintf(std_buf, sizeof(std_buf), data->format, data->value);
if (!TEST_str_eq(bio_buf, data->expected)
+ !TEST_int_eq(bio_ret, exp_ret))
return 0; return 0;
/*
* We treat the unexpected discrepancies with libc results as notable,
* but not fatal.
*/
if (!TEST_str_eq(bio_buf, std_buf)
+ !TEST_int_eq(bio_ret, std_ret)) {
TEST_note("Format: \"%s\"", data->format);
#if defined(OPENSSL_STRICT_LIBC_PRINTF_CHECK)
return 0;
#endif
}
return 1; return 1;
} }
@ -199,30 +239,57 @@ static int dofptest(int test, int sub, double val, const char *width, int prec)
static const char *fspecs[] = { static const char *fspecs[] = {
"e", "f", "g", "E", "G" "e", "f", "g", "E", "G"
}; };
char format[80], result[80]; char format[80], result[80], std_result[80];
int ret = 1, i; int ret = 1, i;
int exp_ret;
int bio_ret;
int std_ret;
for (i = 0; i < (int)OSSL_NELEM(fspecs); i++) { for (i = 0; i < (int)OSSL_NELEM(fspecs); i++) {
const char *fspec = fspecs[i]; const char *fspec = fspecs[i];
memset(result, '@', sizeof(result)); memset(result, '@', sizeof(result));
memset(std_result, '#', sizeof(std_result));
if (prec >= 0) if (prec >= 0)
BIO_snprintf(format, sizeof(format), "%%%s.%d%s", width, prec, BIO_snprintf(format, sizeof(format), "%%%s.%d%s", width, prec,
fspec); fspec);
else else
BIO_snprintf(format, sizeof(format), "%%%s%s", width, fspec); BIO_snprintf(format, sizeof(format), "%%%s%s", width, fspec);
BIO_snprintf(result, sizeof(result), format, val);
exp_ret = (int) strlen(fpexpected[test][sub][i]);
bio_ret = BIO_snprintf(result, sizeof(result), format, val);
std_ret = snprintf(std_result, sizeof(std_result), format, val);
if (justprint) { if (justprint) {
if (i == 0) if (i == 0)
printf(" /* %d.%02d */ { \"%s\"", test, sub, result); printf(" /* %d.%02d */ { \"%s\"", test, sub, result);
else else
printf(", \"%s\"", result); printf(", \"%s\"", result);
} else if (!TEST_str_eq(fpexpected[test][sub][i], result)) { } else {
TEST_info("test %d format=|%s| exp=|%s|, ret=|%s|", if (!TEST_str_eq(fpexpected[test][sub][i], result)
test, format, fpexpected[test][sub][i], result); + !TEST_int_eq(bio_ret, exp_ret)) {
ret = 0; TEST_info("test %d format=|%s| exp=|%s|, ret=|%s|"
", stdlib_ret=|%s|",
test, format, fpexpected[test][sub][i], result,
std_result);
ret = 0;
}
/*
* We treat the unexpected discrepancies with libc results as notable,
* but not fatal.
*/
if (!TEST_str_eq(result, std_result)
+ !TEST_int_eq(bio_ret, std_ret)) {
TEST_info("test %d format=|%s| exp=|%s|, ret=|%s|"
", stdlib_ret=|%s|",
test, format, fpexpected[test][sub][i], result,
std_result);
#if defined(OPENSSL_STRICT_LIBC_PRINTF_CHECK)
ret = 0;
#endif
}
} }
} }
if (justprint) if (justprint)