[DTrace-devel] [PATCH 19/61] Handle high-order bits of rand() properly

Kris Van Hees kris.van.hees at oracle.com
Thu Jul 28 15:03:17 UTC 2022


On Fri, Jul 08, 2022 at 10:45:03AM -0400, eugene.loh--- via DTrace-devel wrote:
> From: Eugene Loh <eugene.loh at oracle.com>
> 
> The D rand() function is declared to be "int" -- a 4-byte, signed
> integer.  Internally, D represents integers as 64-bit quantities.
> Therefore, after calling the BPF helper function to get 32 random
> bits, we should sign-extend the upper bits.
> 
> Meanwhile, the rand_intra test was checking if the uppermost 32 bits
> of "x = rand()" were 0.  This makes no sense since x is a signed,
> 4-byte integer and should be populated with 0xffffffff half of the
> time.  The test would fail once x is correctly sign-extended (by a
> future patch).  Eliminate the check on the upper bits.
> 
> Signed-off-by: Eugene Loh <eugene.loh at oracle.com>

Reviewed-by: Kris Van Hees <kris.van.hees at oracle.com>

... queued for dev

> ---
>  libdtrace/dt_cg.c                     |  4 +++-
>  test/unittest/funcs/tst.rand_intra.sh | 15 +++++----------
>  2 files changed, 8 insertions(+), 11 deletions(-)
> 
> diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
> index 4729710d..633e4613 100644
> --- a/libdtrace/dt_cg.c
> +++ b/libdtrace/dt_cg.c
> @@ -3907,7 +3907,9 @@ dt_cg_subr_rand(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
>  	dt_regset_free_args(drp);
>  	emit(dlp,  BPF_MOV_REG(dnp->dn_reg, BPF_REG_0));
>  	dt_regset_free(drp, BPF_REG_0);
> -	emit(dlp,  BPF_ALU64_IMM(BPF_AND, dnp->dn_reg, 0xffffffff));
> +
> +	emit(dlp,  BPF_ALU64_IMM(BPF_LSH, dnp->dn_reg, 32));
> +	emit(dlp,  BPF_ALU64_IMM(BPF_ARSH, dnp->dn_reg, 32));
>  
>  	TRACE_REGSET("    subr-rand:End  ");
>  }
> diff --git a/test/unittest/funcs/tst.rand_intra.sh b/test/unittest/funcs/tst.rand_intra.sh
> index 0d263fd5..ac1f43e0 100755
> --- a/test/unittest/funcs/tst.rand_intra.sh
> +++ b/test/unittest/funcs/tst.rand_intra.sh
> @@ -14,7 +14,7 @@ niter=25000
>  # is, use lquantize to look at the distribution of 4-bit blocks.
>  
>  $dtrace $dt_flags -q -o $tmpfile -c test/triggers/bogus-ioctl -n '
> -BEGIN { nuperr = n = 0 }
> +BEGIN { n = 0 }
>  syscall::ioctl:entry
>  /pid == $target/
>  {
> @@ -29,13 +29,12 @@ syscall::ioctl:entry
>  	@g = lquantize((x >> 24) & 0xf, 0, 16, 1);
>  	@h = lquantize((x >> 28) & 0xf, 0, 16, 1);
>  
> -	nuperr += (x & 0xffffffff00000000) ? 1 : 0;
>  	n++;
>  }
>  syscall::ioctl:entry
>  /pid == $target && n >= '$niter'/
>  {
> -	printf("# of upper-bit errors: %d out of %d\n", nuperr, n);
> +	printf("number of iterations: %d\n", n);
>  	exit(0);
>  }'
>  
> @@ -53,13 +52,9 @@ awk '
>          nbins = 16;
>      }
>  
> -    # process line: "# of upper-bit errors: 0 out of ..."
> -    /upper-bit errors/ {
> -        if (int($5) != 0) {
> -            print "ERROR: found some upper-bit errors";
> -            exit 1;
> -        }
> -        n = int($8);
> +    # process line: "number of iterations: ..."
> +    /number of iterations:/ {
> +        n = int($4);
>          if (n != '$niter') {
>              print "ERROR: unexpected amount of data";
>              exit 1;
> -- 
> 2.18.4
> 
> 
> _______________________________________________
> DTrace-devel mailing list
> DTrace-devel at oss.oracle.com
> https://oss.oracle.com/mailman/listinfo/dtrace-devel



More information about the DTrace-devel mailing list