Format problem in printa() for negative values

From: Andreas Longwitz <longwitz_at_incore.de>
Date: Sat, 10 Dec 2022 20:24:40 UTC
On my laptop running FreeBSD 12.3-STABLE #3 r371380 a saw a problem with
the printa() function of DTrace. To explain I use the C program printa:

#include <stdio.h>
#include <unistd.h>

void fkt1() {
   printf( "fkt1() called\n" );
}
void fkt2() {
   printf( "fkt2() called\n" );
}

int main () {
   sleep( 10 );

   fkt1();
   fkt2();
   fkt1();
   fkt2();
   fkt1();
}

After start of printa I run the following DTrace script with "dtrace -p
$(pgrep printa) -s printa.d" :

dtrace:::BEGIN
{
     printf("demo for printa\n");
}

pid$target::fkt1:entry
/execname == "printa"/
{
     @fkt1 = count();
     @saldo1 = sum(1);
     @saldo2 = sum(-1);
}
pid$target::fkt2:entry
/execname == "printa"/
{
     @fkt2 = count();
     @saldo1 = sum(-1);
     @saldo2 = sum(1);
}

dtrace:::END
{
     printf("demo for printa\n");
     printa("fkt1=%@d, fkt2=%@d, saldo1=%@d\n", @fkt1, @fkt2, @saldo1);
     printa("fkt1=%@d, fkt2=%@d, saldo2=%@d\n", @fkt1, @fkt2, @saldo2);
     printa("saldo2=%@d, fkt1=%@d, fkt2=%@d\n", @saldo2, @fkt1, @fkt2);
}

The result is

dtrace: script './printa.d' matched 4 probes
CPU     ID                    FUNCTION:NAME
  3      1                           :BEGIN demo for printa

fkt1() called
fkt2() called
fkt1() called
fkt2() called
fkt1() called
dtrace: pid 11387 has exited
  2      2                             :END demo for printa
fkt1=3, fkt2=2, saldo1=1
fkt1=3, fkt2=2, saldo2=18446744073709551615
saldo2=-1, fkt1=3, fkt2=2

The negative value of @saldo2 is wrong, when it is not the first
parameter in the printa() function.