NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

lib/60635: humanize_number(3): exa/exbi issues



>Number:         60635
>Category:       lib
>Synopsis:       humanize_number(3): exa/exbi issues
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    lib-bug-people
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Sun Aug 23 16:40:01 +0000 2026
>Originator:     Taylor R Campbell
>Release:        current, 11, 10, 9, ...
>Organization:
The NetBSD Countation, SInc.
>Environment:
>Description:

	1. humanize_number() doesn't have any options for producing IEC
	   byte units like KiB/GiB and always uses the nonstandard
	   binary `SI' prefixes (or JEDEC units).

	   Even if you find pronouncing kitty-kibble-bytes^Wkibibytes
	   goofy, we should have a way to produce the IEC units,
	   especially in contexts where binary vs decimal is not clear
	   (like packet rates, which are often in measured in
	   decimal-powers of bits or packets per second, while traffic
	   is often measured in binary-powers of bytes per second).

	2. humanize_number() apparently can't handle single-digit
	   numbers of EiB.

>How-To-Repeat:
$ cat h.c
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>

static void
show(int64_t x)
{
	char buf[5] = "";
	int result;

	result = humanize_number(buf, sizeof(buf), x, "", HN_AUTOSCALE, 0);
	printf("%"PRId64": [%d] -> \"%s\"\n", x, result, buf);
}

int
main(void)
{

	show(1);
	show(1024LL*1024);
	show(1024LL*1024*1024);
	show(1024LL*1024*1024*1024);
	show(1024LL*1024*1024*1024*1024);
	show(1024LL*1024*1024*1024*1024*1024);
	fflush(stdout);
	return ferror(stdout);
}
$ make h
cc -O2   -o h h.c 
$ ./h
1: [2] -> "1 "
1048576: [3] -> "1 M"
1073741824: [3] -> "1 G"
1099511627776: [3] -> "1 T"
1125899906842624: [3] -> "1 P"
1152921504606846976: [-1] -> ""

	Expected output:

1: [2] -> "1 "
1048576: [3] -> "1 M"
1073741824: [3] -> "1 G"
1099511627776: [3] -> "1 T"
1125899906842624: [3] -> "1 P"
1152921504606846976: [3] -> "1 E"

>Fix:

	Yes, please!




Home | Main Index | Thread Index | Old Index