Skip to content

null pointer is not 0 when calling into a dynamically linked library with the self-hosted compiler #26035

Description

@agagniere

Zig Version

0.16.0-dev.1442, 0.15.2

Steps to Reproduce and Observed Behavior

On linux amd64, compile:

conststd=@import("std");
constc=@cImport({
@cInclude("grpc/grpc.h");
});
pubfnmain() !void {
consts: c.grpc_slice= .{
.refcount=null,
.data= .{ .inlined= .{
.length=5,
.bytes="Hello\x00\x00_____-----_____\x00".*,
} },
};
constd: c.gpr_timespec= .{ .tv_sec=1, .clock_type=c.GPR_TIMESPAN };
_=c.grpc_channel_create_call(
@ptrFromInt(0xDeadBeef),
null,
0,
@ptrFromInt(0xCafeBabe),
s,
&s,
d,
null,
);
}
$ zig build-exe minrep.zig -l grpc -fno-llvm # possibly -L ... -I ...
$ ldd minrep	libgrpc.so.51 => [...]/libgrpc.so.51 (0x00007f69da200000)[...]

Then using gdb, stop at the first line of the called function

$ gdb minrep(gdb) break grpc_channel_create_call$pltBreakpoint 1 at 0x101d020(gdb) runBreakpoint 1, 0x000000000101d020 in grpc_channel_create_call$plt ()(gdb) stepgrpc_channel_create_call (channel=0x7fffffffd7e0, parent_call=0x10870f0 <os.linux.x86_64.restore_rt>, propagation_mask=32767, completion_queue=0x7fffffffd958, method=..., host=0x20, deadline=..., reserved=0x7fffffffd810) at src/core/lib/surface/channel.cc:104104 gpr_timespec deadline, void* reserved) {(gdb) step105 GRPC_CHECK(!reserved);(gdb) info argschannel = 0xdeadbeefparent_call = 0x0propagation_mask = 0completion_queue = 0xcafebabemethod = [...]host = 0x11a3040 <__anon_26790>deadline = {tv_sec = 1, tv_nsec = 0, clock_type = GPR_TIMESPAN}reserved = 0x7fffffffdac8

we can see that reserved is not 0

(Note: I built libgrpc locally to get the debug symbols)

Expected Behavior

Using the LLVM backend results in the expected behavior:

$ zig build-exe minrep.zig -L ~/Clones/grpc/libs/dbg -l grpc -I ~/Clones/grpc/include/ -fllvm
$ gdb minrep(gdb) break grpc_channel_create_callBreakpoint 1 at 0x11290c0(gdb) runBreakpoint 1, grpc_channel_create_call (channel=0xdeadbeef, parent_call=0x0, propagation_mask=0, completion_queue=0xcafebabe, method=..., host=0x100d700 <__anon_27427>, deadline=..., reserved=0x0) at src/core/lib/surface/channel.cc:104104 gpr_timespec deadline, void* reserved) {(gdb) step105 GRPC_CHECK(!reserved);(gdb) info argschannel = 0xdeadbeefparent_call = 0x0propagation_mask = 0completion_queue = 0xcafebabemethod = [...]host = 0x100d700 <__anon_27427>deadline = {tv_sec = 1, tv_nsec = 0, clock_type = GPR_TIMESPAN}reserved = 0x0

Here reserved in 0

Metadata

Metadata

Assignees

No one assigned

    Labels

    arch-x86_6464-bit x86backend-self-hostedbugObserved behavior contradicts documented or intended behaviormiscompilationThe compiler reports success but produces semantically incorrect code.

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions