You shouldn't be using %zd.  First, because pass is a size_t, not an ssize_t, and %d is for *signed* types; for unsigned types you should use %u, hence %zu.  Second, I recently got told that (some version of) Solaris doesn't support the z modifier and we get crashy behaviour if we use it; so I think the right thing here is to use %llu and cast the parameter to (unsigned long long).