Panic: incorrect alignment from std.http.Headers contains()

I’m using the std.http.Headers to represent headers in a received request where there will be at least a signature entry expected. When I isolated the panic, at first I wondered whether it was related to my target. However, I can see it reproduce on both linux-aarch64 and FreeBSD (x86). How do I correct the alignment for the map in the headers?

Here is the main.zig and build.zig where issuing zig build test causes the panic:

const std = @import(“std”);
const testing = std.testing;
const Allocator = std.mem.Allocator;

export fn add(a: i32, b: i32) i32 {
return a + b;

test “basic add functionality” {
try testing.expect(add(3, 7) == 10);

test "headers contains " {
const ally = std.testing.allocator;
var raw = try minRawHeaders(ally);

// show headers
//var w = std.ArrayList(u8).init(ally);
//defer w.deinit();
//raw.format("{s}", .{}, w.writer()) catch @panic("headers fmt");
//std.debug.print("\nh {s}", .{w.items});

try testing.expect(raw.contains("signature"));


// simulate raw header fields
fn minRawHeaders(ally: Allocator) !std.http.Headers {
var h2 = std.http.Headers.init(ally);
try h2.append(“host”, “” ) ;
try h2.append(“date”, “Sun, 05 Jan 2014 21:31:40 GMT” ) ;
try h2.append(“content-type”, “application/json” ) ;
try h2.append(“digest”, “SHA-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE=” ) ;
try h2.append(“content-length”, “18” ) ;

try h2.append("signature",
"keyId=\x22Test\x22,algorithm=\x22rsa-sha256\x22,headers=\x22(request-target) host date\x22,signature=\x22qdx+H7PHHDZgy4y/Ahn9Tny9V3GP6YgBPyUXMmoxWtLbHpUnXS2mg2+SbrQDMCJypxBLSPQR2aAjn7ndmw2iicw3HMbe8VfEdKFYRqzic+efkb3nndiv/x1xSHDJWeSWkx3ButlYSuBskLu6kd9Fswtemr3lgdDEmn04swr2Os0=\x22",
) ;

return h2;



const std = @import(“std”);

// Although this function looks imperative, note that its job is to
// declaratively construct a build graph that will be executed by an external
// runner.
pub fn build(b: *std.Build) void {
// Standard target options allows the person running zig build to choose
// what target to build for. Here we do not override the defaults, which
// means any target is allowed, and the default is native. Other options
// for restricting supported target set are available.
const target = b.standardTargetOptions(.{});

// Standard optimization options allow the person running `zig build` to select
// between Debug, ReleaseSafe, ReleaseFast, and ReleaseSmall. Here we do not
// set a preferred release mode, allowing the user to decide how to optimize.
const optimize = b.standardOptimizeOption(.{});

const lib = b.addStaticLibrary(.{
    .name = "learn-headers",
    // In this case the main source file is merely a path, however, in more
    // complicated build scripts, this could be a generated file.
    .root_source_file = .{ .path = "src/main.zig" },
    .target = target,
    .optimize = optimize,

// This declares intent for the library to be installed into the standard
// location when the user invokes the "install" step (the default step when
// running `zig build`).

// Creates a step for unit testing. This only builds the test executable
// but does not run it.
const main_tests = b.addTest(.{
    .root_source_file = .{ .path = "src/main.zig" },
    .target = target,
    .optimize = optimize,

const run_main_tests = b.addRunArtifact(main_tests);

// This creates a build step. It will be visible in the `zig build --help` menu,
// and can be selected like this: `zig build test`
// This will evaluate the `test` step rather than the default, which is "install".
const test_step = b.step("test", "Run library tests");


oops I forgot to mention that I’m using the nightly build of Zig. This run happens to be 0.11.0-dev.3381+9ee0a706d. However, I have experienced the error with earlier builds, but I didn’t isolate it down to the line until now.

double oops. Nevermind. I can see after pasting the code here that I am missing the defer on the raw.deinit() Call this “User Error”.


Will you look at that, the Ziggit forum is even a debugging tool! How ya like them apples, Discord? :rofl: