authorgravatar for 124872+jedisct1@users.noreply.github.comFrank Denis <124872+jedisct1@users.noreply.github.com> 2023-10-02 19:37:17-06:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-10-03 02:51:01-07:00
log4930094e622c043d9be459abbfc5a7b203a22aa2
tree19e81fd0a9271a3f5d97ccb47740d8564ac898ff
parent0bdbd3e235daee64caf1f99e5b9d7b62f4c5c484

valgrind.memcheck: fix makeMem*()

The `makeMem*()` functions crashed under valgrind in Debug and ReleaseSafe modes. The reason being that `doMemCheckClientRequestExpr()` returns `0` when not running under Valgrind, and `maxInt(usize)` when running under Valgrind. Thus, `@as(i1, @intCast(maxInt(usize)))` always fails and these functions crashed before returning. That being said, what these functions used to return was quite unexpected: `0` on error and `-1` on success (=running under valgrind). That doesn't match any Zig nor C conventions. But that return value doesn't seem to be very useful. Either we are running under Valgrind or we are not. There's no point in checking this for every single call. Applications are likely to always discard it. So, just return a `void` instead. Also avoid function comments that start with `Similarly, ...` because that doesn't refer to anything in the context of autodoc or in IDEs.

1 files changed, 14 insertions(+), 20 deletions(-)

lib/std/valgrind/memcheck.zig+14-20
...@@ -29,35 +29,29 @@ fn doMemCheckClientRequestStmt(request: MemCheckClientRequest, a1: usize, a2: us...@@ -29,35 +29,29 @@ fn doMemCheckClientRequestStmt(request: MemCheckClientRequest, a1: usize, a2: us
29}29}
3030
31/// Mark memory at qzz.ptr as unaddressable for qzz.len bytes.31/// Mark memory at qzz.ptr as unaddressable for qzz.len bytes.
32/// This returns -1 when run on Valgrind and 0 otherwise.32pub fn makeMemNoAccess(qzz: []u8) void {
33pub fn makeMemNoAccess(qzz: []u8) i1 {33 _ = doMemCheckClientRequestExpr(0, // default return
34 return @as(i1, @intCast(doMemCheckClientRequestExpr(0, // default return34 .MakeMemNoAccess, @intFromPtr(qzz.ptr), qzz.len, 0, 0, 0);
35 .MakeMemNoAccess, @intFromPtr(qzz.ptr), qzz.len, 0, 0, 0)));
36}35}
3736
38/// Similarly, mark memory at qzz.ptr as addressable but undefined37/// Mark memory at qzz.ptr as addressable but undefined for qzz.len bytes.
39/// for qzz.len bytes.38pub fn makeMemUndefined(qzz: []u8) void {
40/// This returns -1 when run on Valgrind and 0 otherwise.39 _ = doMemCheckClientRequestExpr(0, // default return
41pub fn makeMemUndefined(qzz: []u8) i1 {40 .MakeMemUndefined, @intFromPtr(qzz.ptr), qzz.len, 0, 0, 0);
42 return @as(i1, @intCast(doMemCheckClientRequestExpr(0, // default return
43 .MakeMemUndefined, @intFromPtr(qzz.ptr), qzz.len, 0, 0, 0)));
44}41}
4542
46/// Similarly, mark memory at qzz.ptr as addressable and defined43/// Mark memory at qzz.ptr as addressable and defined or qzz.len bytes.
47/// for qzz.len bytes.44pub fn makeMemDefined(qzz: []u8) void {
48pub fn makeMemDefined(qzz: []u8) i1 {45 _ = doMemCheckClientRequestExpr(0, // default return
49 // This returns -1 when run on Valgrind and 0 otherwise.46 .MakeMemDefined, @intFromPtr(qzz.ptr), qzz.len, 0, 0, 0);
50 return @as(i1, @intCast(doMemCheckClientRequestExpr(0, // default return
51 .MakeMemDefined, @intFromPtr(qzz.ptr), qzz.len, 0, 0, 0)));
52}47}
5348
54/// Similar to makeMemDefined except that addressability is49/// Similar to makeMemDefined except that addressability is
55/// not altered: bytes which are addressable are marked as defined,50/// not altered: bytes which are addressable are marked as defined,
56/// but those which are not addressable are left unchanged.51/// but those which are not addressable are left unchanged.
57/// This returns -1 when run on Valgrind and 0 otherwise.52pub fn makeMemDefinedIfAddressable(qzz: []u8) void {
58pub fn makeMemDefinedIfAddressable(qzz: []u8) i1 {53 _ = doMemCheckClientRequestExpr(0, // default return
59 return @as(i1, @intCast(doMemCheckClientRequestExpr(0, // default return54 .MakeMemDefinedIfAddressable, @intFromPtr(qzz.ptr), qzz.len, 0, 0, 0);
60 .MakeMemDefinedIfAddressable, @intFromPtr(qzz.ptr), qzz.len, 0, 0, 0)));
61}55}
6256
63/// Create a block-description handle. The description is an ascii57/// Create a block-description handle. The description is an ascii