*/
 int probe_memcg_account(void)
 {
-       const size_t prog_load_attr_sz = offsetofend(union bpf_attr, attach_btf_obj_fd);
+       const size_t attr_sz = offsetofend(union bpf_attr, attach_btf_obj_fd);
        struct bpf_insn insns[] = {
                BPF_EMIT_CALL(BPF_FUNC_ktime_get_coarse_ns),
                BPF_EXIT_INSN(),
        int prog_fd;
 
        /* attempt loading freplace trying to use custom BTF */
-       memset(&attr, 0, prog_load_attr_sz);
+       memset(&attr, 0, attr_sz);
        attr.prog_type = BPF_PROG_TYPE_SOCKET_FILTER;
        attr.insns = ptr_to_u64(insns);
        attr.insn_cnt = insn_cnt;
        attr.license = ptr_to_u64("GPL");
 
-       prog_fd = sys_bpf_fd(BPF_PROG_LOAD, &attr, prog_load_attr_sz);
+       prog_fd = sys_bpf_fd(BPF_PROG_LOAD, &attr, attr_sz);
        if (prog_fd >= 0) {
                close(prog_fd);
                return 1;
                  const struct bpf_insn *insns, size_t insn_cnt,
                  const struct bpf_prog_load_opts *opts)
 {
+       const size_t attr_sz = offsetofend(union bpf_attr, fd_array);
        void *finfo = NULL, *linfo = NULL;
        const char *func_info, *line_info;
        __u32 log_size, log_level, attach_prog_fd, attach_btf_obj_fd;
        if (attempts == 0)
                attempts = PROG_LOAD_ATTEMPTS;
 
-       memset(&attr, 0, sizeof(attr));
+       memset(&attr, 0, attr_sz);
 
        attr.prog_type = prog_type;
        attr.expected_attach_type = OPTS_GET(opts, expected_attach_type, 0);
                attr.log_level = log_level;
        }
 
-       fd = sys_bpf_prog_load(&attr, sizeof(attr), attempts);
+       fd = sys_bpf_prog_load(&attr, attr_sz, attempts);
        if (fd >= 0)
                return fd;
 
                        break;
                }
 
-               fd = sys_bpf_prog_load(&attr, sizeof(attr), attempts);
+               fd = sys_bpf_prog_load(&attr, attr_sz, attempts);
                if (fd >= 0)
                        goto done;
        }
                attr.log_size = log_size;
                attr.log_level = 1;
 
-               fd = sys_bpf_prog_load(&attr, sizeof(attr), attempts);
+               fd = sys_bpf_prog_load(&attr, attr_sz, attempts);
        }
 done:
        /* free() doesn't affect errno, so we don't need to restore it */
 int bpf_map_update_elem(int fd, const void *key, const void *value,
                        __u64 flags)
 {
+       const size_t attr_sz = offsetofend(union bpf_attr, flags);
        union bpf_attr attr;
        int ret;
 
-       memset(&attr, 0, sizeof(attr));
+       memset(&attr, 0, attr_sz);
        attr.map_fd = fd;
        attr.key = ptr_to_u64(key);
        attr.value = ptr_to_u64(value);
        attr.flags = flags;
 
-       ret = sys_bpf(BPF_MAP_UPDATE_ELEM, &attr, sizeof(attr));
+       ret = sys_bpf(BPF_MAP_UPDATE_ELEM, &attr, attr_sz);
        return libbpf_err_errno(ret);
 }
 
 int bpf_map_lookup_elem(int fd, const void *key, void *value)
 {
+       const size_t attr_sz = offsetofend(union bpf_attr, flags);
        union bpf_attr attr;
        int ret;
 
-       memset(&attr, 0, sizeof(attr));
+       memset(&attr, 0, attr_sz);
        attr.map_fd = fd;
        attr.key = ptr_to_u64(key);
        attr.value = ptr_to_u64(value);
 
-       ret = sys_bpf(BPF_MAP_LOOKUP_ELEM, &attr, sizeof(attr));
+       ret = sys_bpf(BPF_MAP_LOOKUP_ELEM, &attr, attr_sz);
        return libbpf_err_errno(ret);
 }
 
 int bpf_map_lookup_elem_flags(int fd, const void *key, void *value, __u64 flags)
 {
+       const size_t attr_sz = offsetofend(union bpf_attr, flags);
        union bpf_attr attr;
        int ret;
 
-       memset(&attr, 0, sizeof(attr));
+       memset(&attr, 0, attr_sz);
        attr.map_fd = fd;
        attr.key = ptr_to_u64(key);
        attr.value = ptr_to_u64(value);
        attr.flags = flags;
 
-       ret = sys_bpf(BPF_MAP_LOOKUP_ELEM, &attr, sizeof(attr));
+       ret = sys_bpf(BPF_MAP_LOOKUP_ELEM, &attr, attr_sz);
        return libbpf_err_errno(ret);
 }
 
 int bpf_map_lookup_and_delete_elem(int fd, const void *key, void *value)
 {
+       const size_t attr_sz = offsetofend(union bpf_attr, flags);
        union bpf_attr attr;
        int ret;
 
-       memset(&attr, 0, sizeof(attr));
+       memset(&attr, 0, attr_sz);
        attr.map_fd = fd;
        attr.key = ptr_to_u64(key);
        attr.value = ptr_to_u64(value);
 
-       ret = sys_bpf(BPF_MAP_LOOKUP_AND_DELETE_ELEM, &attr, sizeof(attr));
+       ret = sys_bpf(BPF_MAP_LOOKUP_AND_DELETE_ELEM, &attr, attr_sz);
        return libbpf_err_errno(ret);
 }
 
 int bpf_map_lookup_and_delete_elem_flags(int fd, const void *key, void *value, __u64 flags)
 {
+       const size_t attr_sz = offsetofend(union bpf_attr, flags);
        union bpf_attr attr;
        int ret;
 
-       memset(&attr, 0, sizeof(attr));
+       memset(&attr, 0, attr_sz);
        attr.map_fd = fd;
        attr.key = ptr_to_u64(key);
        attr.value = ptr_to_u64(value);
        attr.flags = flags;
 
-       ret = sys_bpf(BPF_MAP_LOOKUP_AND_DELETE_ELEM, &attr, sizeof(attr));
+       ret = sys_bpf(BPF_MAP_LOOKUP_AND_DELETE_ELEM, &attr, attr_sz);
        return libbpf_err_errno(ret);
 }
 
 int bpf_map_delete_elem(int fd, const void *key)
 {
+       const size_t attr_sz = offsetofend(union bpf_attr, flags);
        union bpf_attr attr;
        int ret;
 
-       memset(&attr, 0, sizeof(attr));
+       memset(&attr, 0, attr_sz);
        attr.map_fd = fd;
        attr.key = ptr_to_u64(key);
 
-       ret = sys_bpf(BPF_MAP_DELETE_ELEM, &attr, sizeof(attr));
+       ret = sys_bpf(BPF_MAP_DELETE_ELEM, &attr, attr_sz);
        return libbpf_err_errno(ret);
 }
 
 int bpf_map_delete_elem_flags(int fd, const void *key, __u64 flags)
 {
+       const size_t attr_sz = offsetofend(union bpf_attr, flags);
        union bpf_attr attr;
        int ret;
 
-       memset(&attr, 0, sizeof(attr));
+       memset(&attr, 0, attr_sz);
        attr.map_fd = fd;
        attr.key = ptr_to_u64(key);
        attr.flags = flags;
 
-       ret = sys_bpf(BPF_MAP_DELETE_ELEM, &attr, sizeof(attr));
+       ret = sys_bpf(BPF_MAP_DELETE_ELEM, &attr, attr_sz);
        return libbpf_err_errno(ret);
 }
 
 int bpf_map_get_next_key(int fd, const void *key, void *next_key)
 {
+       const size_t attr_sz = offsetofend(union bpf_attr, next_key);
        union bpf_attr attr;
        int ret;
 
-       memset(&attr, 0, sizeof(attr));
+       memset(&attr, 0, attr_sz);
        attr.map_fd = fd;
        attr.key = ptr_to_u64(key);
        attr.next_key = ptr_to_u64(next_key);
 
-       ret = sys_bpf(BPF_MAP_GET_NEXT_KEY, &attr, sizeof(attr));
+       ret = sys_bpf(BPF_MAP_GET_NEXT_KEY, &attr, attr_sz);
        return libbpf_err_errno(ret);
 }
 
 int bpf_map_freeze(int fd)
 {
+       const size_t attr_sz = offsetofend(union bpf_attr, map_fd);
        union bpf_attr attr;
        int ret;
 
-       memset(&attr, 0, sizeof(attr));
+       memset(&attr, 0, attr_sz);
        attr.map_fd = fd;
 
-       ret = sys_bpf(BPF_MAP_FREEZE, &attr, sizeof(attr));
+       ret = sys_bpf(BPF_MAP_FREEZE, &attr, attr_sz);
        return libbpf_err_errno(ret);
 }
 
                                __u32 *count,
                                const struct bpf_map_batch_opts *opts)
 {
+       const size_t attr_sz = offsetofend(union bpf_attr, batch);
        union bpf_attr attr;
        int ret;
 
        if (!OPTS_VALID(opts, bpf_map_batch_opts))
                return libbpf_err(-EINVAL);
 
-       memset(&attr, 0, sizeof(attr));
+       memset(&attr, 0, attr_sz);
        attr.batch.map_fd = fd;
        attr.batch.in_batch = ptr_to_u64(in_batch);
        attr.batch.out_batch = ptr_to_u64(out_batch);
        attr.batch.elem_flags  = OPTS_GET(opts, elem_flags, 0);
        attr.batch.flags = OPTS_GET(opts, flags, 0);
 
-       ret = sys_bpf(cmd, &attr, sizeof(attr));
+       ret = sys_bpf(cmd, &attr, attr_sz);
        *count = attr.batch.count;
 
        return libbpf_err_errno(ret);
 
 int bpf_obj_pin(int fd, const char *pathname)
 {
+       const size_t attr_sz = offsetofend(union bpf_attr, file_flags);
        union bpf_attr attr;
        int ret;
 
-       memset(&attr, 0, sizeof(attr));
+       memset(&attr, 0, attr_sz);
        attr.pathname = ptr_to_u64((void *)pathname);
        attr.bpf_fd = fd;
 
-       ret = sys_bpf(BPF_OBJ_PIN, &attr, sizeof(attr));
+       ret = sys_bpf(BPF_OBJ_PIN, &attr, attr_sz);
        return libbpf_err_errno(ret);
 }
 
 
 int bpf_obj_get_opts(const char *pathname, const struct bpf_obj_get_opts *opts)
 {
+       const size_t attr_sz = offsetofend(union bpf_attr, file_flags);
        union bpf_attr attr;
        int fd;
 
        if (!OPTS_VALID(opts, bpf_obj_get_opts))
                return libbpf_err(-EINVAL);
 
-       memset(&attr, 0, sizeof(attr));
+       memset(&attr, 0, attr_sz);
        attr.pathname = ptr_to_u64((void *)pathname);
        attr.file_flags = OPTS_GET(opts, file_flags, 0);
 
-       fd = sys_bpf_fd(BPF_OBJ_GET, &attr, sizeof(attr));
+       fd = sys_bpf_fd(BPF_OBJ_GET, &attr, attr_sz);
        return libbpf_err_errno(fd);
 }
 
                          enum bpf_attach_type type,
                          const struct bpf_prog_attach_opts *opts)
 {
+       const size_t attr_sz = offsetofend(union bpf_attr, replace_bpf_fd);
        union bpf_attr attr;
        int ret;
 
        if (!OPTS_VALID(opts, bpf_prog_attach_opts))
                return libbpf_err(-EINVAL);
 
-       memset(&attr, 0, sizeof(attr));
+       memset(&attr, 0, attr_sz);
        attr.target_fd     = target_fd;
        attr.attach_bpf_fd = prog_fd;
        attr.attach_type   = type;
        attr.attach_flags  = OPTS_GET(opts, flags, 0);
        attr.replace_bpf_fd = OPTS_GET(opts, replace_prog_fd, 0);
 
-       ret = sys_bpf(BPF_PROG_ATTACH, &attr, sizeof(attr));
+       ret = sys_bpf(BPF_PROG_ATTACH, &attr, attr_sz);
        return libbpf_err_errno(ret);
 }
 
 
 int bpf_prog_detach(int target_fd, enum bpf_attach_type type)
 {
+       const size_t attr_sz = offsetofend(union bpf_attr, replace_bpf_fd);
        union bpf_attr attr;
        int ret;
 
-       memset(&attr, 0, sizeof(attr));
+       memset(&attr, 0, attr_sz);
        attr.target_fd   = target_fd;
        attr.attach_type = type;
 
-       ret = sys_bpf(BPF_PROG_DETACH, &attr, sizeof(attr));
+       ret = sys_bpf(BPF_PROG_DETACH, &attr, attr_sz);
        return libbpf_err_errno(ret);
 }
 
 int bpf_prog_detach2(int prog_fd, int target_fd, enum bpf_attach_type type)
 {
+       const size_t attr_sz = offsetofend(union bpf_attr, replace_bpf_fd);
        union bpf_attr attr;
        int ret;
 
-       memset(&attr, 0, sizeof(attr));
+       memset(&attr, 0, attr_sz);
        attr.target_fd   = target_fd;
        attr.attach_bpf_fd = prog_fd;
        attr.attach_type = type;
 
-       ret = sys_bpf(BPF_PROG_DETACH, &attr, sizeof(attr));
+       ret = sys_bpf(BPF_PROG_DETACH, &attr, attr_sz);
        return libbpf_err_errno(ret);
 }
 
                    enum bpf_attach_type attach_type,
                    const struct bpf_link_create_opts *opts)
 {
+       const size_t attr_sz = offsetofend(union bpf_attr, link_create);
        __u32 target_btf_id, iter_info_len;
        union bpf_attr attr;
        int fd, err;
                        return libbpf_err(-EINVAL);
        }
 
-       memset(&attr, 0, sizeof(attr));
+       memset(&attr, 0, attr_sz);
        attr.link_create.prog_fd = prog_fd;
        attr.link_create.target_fd = target_fd;
        attr.link_create.attach_type = attach_type;
                break;
        }
 proceed:
-       fd = sys_bpf_fd(BPF_LINK_CREATE, &attr, sizeof(attr));
+       fd = sys_bpf_fd(BPF_LINK_CREATE, &attr, attr_sz);
        if (fd >= 0)
                return fd;
        /* we'll get EINVAL if LINK_CREATE doesn't support attaching fentry
 
 int bpf_link_detach(int link_fd)
 {
+       const size_t attr_sz = offsetofend(union bpf_attr, link_detach);
        union bpf_attr attr;
        int ret;
 
-       memset(&attr, 0, sizeof(attr));
+       memset(&attr, 0, attr_sz);
        attr.link_detach.link_fd = link_fd;
 
-       ret = sys_bpf(BPF_LINK_DETACH, &attr, sizeof(attr));
+       ret = sys_bpf(BPF_LINK_DETACH, &attr, attr_sz);
        return libbpf_err_errno(ret);
 }
 
 int bpf_link_update(int link_fd, int new_prog_fd,
                    const struct bpf_link_update_opts *opts)
 {
+       const size_t attr_sz = offsetofend(union bpf_attr, link_update);
        union bpf_attr attr;
        int ret;
 
        if (!OPTS_VALID(opts, bpf_link_update_opts))
                return libbpf_err(-EINVAL);
 
-       memset(&attr, 0, sizeof(attr));
+       memset(&attr, 0, attr_sz);
        attr.link_update.link_fd = link_fd;
        attr.link_update.new_prog_fd = new_prog_fd;
        attr.link_update.flags = OPTS_GET(opts, flags, 0);
        attr.link_update.old_prog_fd = OPTS_GET(opts, old_prog_fd, 0);
 
-       ret = sys_bpf(BPF_LINK_UPDATE, &attr, sizeof(attr));
+       ret = sys_bpf(BPF_LINK_UPDATE, &attr, attr_sz);
        return libbpf_err_errno(ret);
 }
 
 int bpf_iter_create(int link_fd)
 {
+       const size_t attr_sz = offsetofend(union bpf_attr, iter_create);
        union bpf_attr attr;
        int fd;
 
-       memset(&attr, 0, sizeof(attr));
+       memset(&attr, 0, attr_sz);
        attr.iter_create.link_fd = link_fd;
 
-       fd = sys_bpf_fd(BPF_ITER_CREATE, &attr, sizeof(attr));
+       fd = sys_bpf_fd(BPF_ITER_CREATE, &attr, attr_sz);
        return libbpf_err_errno(fd);
 }
 
                        enum bpf_attach_type type,
                        struct bpf_prog_query_opts *opts)
 {
+       const size_t attr_sz = offsetofend(union bpf_attr, query);
        union bpf_attr attr;
        int ret;
 
        if (!OPTS_VALID(opts, bpf_prog_query_opts))
                return libbpf_err(-EINVAL);
 
-       memset(&attr, 0, sizeof(attr));
+       memset(&attr, 0, attr_sz);
 
        attr.query.target_fd    = target_fd;
        attr.query.attach_type  = type;
        attr.query.prog_ids     = ptr_to_u64(OPTS_GET(opts, prog_ids, NULL));
        attr.query.prog_attach_flags = ptr_to_u64(OPTS_GET(opts, prog_attach_flags, NULL));
 
-       ret = sys_bpf(BPF_PROG_QUERY, &attr, sizeof(attr));
+       ret = sys_bpf(BPF_PROG_QUERY, &attr, attr_sz);
 
        OPTS_SET(opts, attach_flags, attr.query.attach_flags);
        OPTS_SET(opts, prog_cnt, attr.query.prog_cnt);
 
 int bpf_prog_test_run_opts(int prog_fd, struct bpf_test_run_opts *opts)
 {
+       const size_t attr_sz = offsetofend(union bpf_attr, test);
        union bpf_attr attr;
        int ret;
 
        if (!OPTS_VALID(opts, bpf_test_run_opts))
                return libbpf_err(-EINVAL);
 
-       memset(&attr, 0, sizeof(attr));
+       memset(&attr, 0, attr_sz);
        attr.test.prog_fd = prog_fd;
        attr.test.batch_size = OPTS_GET(opts, batch_size, 0);
        attr.test.cpu = OPTS_GET(opts, cpu, 0);
        attr.test.data_in = ptr_to_u64(OPTS_GET(opts, data_in, NULL));
        attr.test.data_out = ptr_to_u64(OPTS_GET(opts, data_out, NULL));
 
-       ret = sys_bpf(BPF_PROG_TEST_RUN, &attr, sizeof(attr));
+       ret = sys_bpf(BPF_PROG_TEST_RUN, &attr, attr_sz);
 
        OPTS_SET(opts, data_size_out, attr.test.data_size_out);
        OPTS_SET(opts, ctx_size_out, attr.test.ctx_size_out);
 
 static int bpf_obj_get_next_id(__u32 start_id, __u32 *next_id, int cmd)
 {
+       const size_t attr_sz = offsetofend(union bpf_attr, open_flags);
        union bpf_attr attr;
        int err;
 
-       memset(&attr, 0, sizeof(attr));
+       memset(&attr, 0, attr_sz);
        attr.start_id = start_id;
 
-       err = sys_bpf(cmd, &attr, sizeof(attr));
+       err = sys_bpf(cmd, &attr, attr_sz);
        if (!err)
                *next_id = attr.next_id;
 
 
 int bpf_prog_get_fd_by_id(__u32 id)
 {
+       const size_t attr_sz = offsetofend(union bpf_attr, open_flags);
        union bpf_attr attr;
        int fd;
 
-       memset(&attr, 0, sizeof(attr));
+       memset(&attr, 0, attr_sz);
        attr.prog_id = id;
 
-       fd = sys_bpf_fd(BPF_PROG_GET_FD_BY_ID, &attr, sizeof(attr));
+       fd = sys_bpf_fd(BPF_PROG_GET_FD_BY_ID, &attr, attr_sz);
        return libbpf_err_errno(fd);
 }
 
 int bpf_map_get_fd_by_id(__u32 id)
 {
+       const size_t attr_sz = offsetofend(union bpf_attr, open_flags);
        union bpf_attr attr;
        int fd;
 
-       memset(&attr, 0, sizeof(attr));
+       memset(&attr, 0, attr_sz);
        attr.map_id = id;
 
-       fd = sys_bpf_fd(BPF_MAP_GET_FD_BY_ID, &attr, sizeof(attr));
+       fd = sys_bpf_fd(BPF_MAP_GET_FD_BY_ID, &attr, attr_sz);
        return libbpf_err_errno(fd);
 }
 
 int bpf_btf_get_fd_by_id(__u32 id)
 {
+       const size_t attr_sz = offsetofend(union bpf_attr, open_flags);
        union bpf_attr attr;
        int fd;
 
-       memset(&attr, 0, sizeof(attr));
+       memset(&attr, 0, attr_sz);
        attr.btf_id = id;
 
-       fd = sys_bpf_fd(BPF_BTF_GET_FD_BY_ID, &attr, sizeof(attr));
+       fd = sys_bpf_fd(BPF_BTF_GET_FD_BY_ID, &attr, attr_sz);
        return libbpf_err_errno(fd);
 }
 
 int bpf_link_get_fd_by_id(__u32 id)
 {
+       const size_t attr_sz = offsetofend(union bpf_attr, open_flags);
        union bpf_attr attr;
        int fd;
 
-       memset(&attr, 0, sizeof(attr));
+       memset(&attr, 0, attr_sz);
        attr.link_id = id;
 
-       fd = sys_bpf_fd(BPF_LINK_GET_FD_BY_ID, &attr, sizeof(attr));
+       fd = sys_bpf_fd(BPF_LINK_GET_FD_BY_ID, &attr, attr_sz);
        return libbpf_err_errno(fd);
 }
 
 int bpf_obj_get_info_by_fd(int bpf_fd, void *info, __u32 *info_len)
 {
+       const size_t attr_sz = offsetofend(union bpf_attr, info);
        union bpf_attr attr;
        int err;
 
-       memset(&attr, 0, sizeof(attr));
+       memset(&attr, 0, attr_sz);
        attr.info.bpf_fd = bpf_fd;
        attr.info.info_len = *info_len;
        attr.info.info = ptr_to_u64(info);
 
-       err = sys_bpf(BPF_OBJ_GET_INFO_BY_FD, &attr, sizeof(attr));
-
+       err = sys_bpf(BPF_OBJ_GET_INFO_BY_FD, &attr, attr_sz);
        if (!err)
                *info_len = attr.info.info_len;
-
        return libbpf_err_errno(err);
 }
 
 int bpf_raw_tracepoint_open(const char *name, int prog_fd)
 {
+       const size_t attr_sz = offsetofend(union bpf_attr, raw_tracepoint);
        union bpf_attr attr;
        int fd;
 
-       memset(&attr, 0, sizeof(attr));
+       memset(&attr, 0, attr_sz);
        attr.raw_tracepoint.name = ptr_to_u64(name);
        attr.raw_tracepoint.prog_fd = prog_fd;
 
-       fd = sys_bpf_fd(BPF_RAW_TRACEPOINT_OPEN, &attr, sizeof(attr));
+       fd = sys_bpf_fd(BPF_RAW_TRACEPOINT_OPEN, &attr, attr_sz);
        return libbpf_err_errno(fd);
 }
 
                      __u32 *prog_id, __u32 *fd_type, __u64 *probe_offset,
                      __u64 *probe_addr)
 {
-       union bpf_attr attr = {};
+       const size_t attr_sz = offsetofend(union bpf_attr, task_fd_query);
+       union bpf_attr attr;
        int err;
 
+       memset(&attr, 0, attr_sz);
        attr.task_fd_query.pid = pid;
        attr.task_fd_query.fd = fd;
        attr.task_fd_query.flags = flags;
        attr.task_fd_query.buf = ptr_to_u64(buf);
        attr.task_fd_query.buf_len = *buf_len;
 
-       err = sys_bpf(BPF_TASK_FD_QUERY, &attr, sizeof(attr));
+       err = sys_bpf(BPF_TASK_FD_QUERY, &attr, attr_sz);
 
        *buf_len = attr.task_fd_query.buf_len;
        *prog_id = attr.task_fd_query.prog_id;
 
 int bpf_enable_stats(enum bpf_stats_type type)
 {
+       const size_t attr_sz = offsetofend(union bpf_attr, enable_stats);
        union bpf_attr attr;
        int fd;
 
-       memset(&attr, 0, sizeof(attr));
+       memset(&attr, 0, attr_sz);
        attr.enable_stats.type = type;
 
-       fd = sys_bpf_fd(BPF_ENABLE_STATS, &attr, sizeof(attr));
+       fd = sys_bpf_fd(BPF_ENABLE_STATS, &attr, attr_sz);
        return libbpf_err_errno(fd);
 }
 
 int bpf_prog_bind_map(int prog_fd, int map_fd,
                      const struct bpf_prog_bind_opts *opts)
 {
+       const size_t attr_sz = offsetofend(union bpf_attr, prog_bind_map);
        union bpf_attr attr;
        int ret;
 
        if (!OPTS_VALID(opts, bpf_prog_bind_opts))
                return libbpf_err(-EINVAL);
 
-       memset(&attr, 0, sizeof(attr));
+       memset(&attr, 0, attr_sz);
        attr.prog_bind_map.prog_fd = prog_fd;
        attr.prog_bind_map.map_fd = map_fd;
        attr.prog_bind_map.flags = OPTS_GET(opts, flags, 0);
 
-       ret = sys_bpf(BPF_PROG_BIND_MAP, &attr, sizeof(attr));
+       ret = sys_bpf(BPF_PROG_BIND_MAP, &attr, attr_sz);
        return libbpf_err_errno(ret);
 }