From: kernel test robot <yujie.liu@intel.com>
To: kbuild-all@lists.01.org
Subject: kernel/bpf/btf.c:4596:38: warning: Either the condition 't?btf_type_vlen(t):MAX_BPF_FUNC_REG_ARGS' is redundant or there is pointer arithmetic with NULL pointer. [nullPointerArithmeticRedundantCheck]
Date: Sun, 29 Aug 2021 15:30:37 +0800 [thread overview]
Message-ID: <a1e957a7-b0aa-f351-56c6-786853b14d1c@intel.com> (raw)
In-Reply-To: <202108290532.6og89Snz-lkp@intel.com>
[-- Attachment #1: Type: text/plain, Size: 16295 bytes --]
tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head: 64b4fc45bea6f4faa843d2f97ff51665280efee1
commit: 523a4cf491b3c9e2d546040d57250f1a0ca84f03 bpf: Use MAX_BPF_FUNC_REG_ARGS macro
date: 6 months ago
:::::: branch date: 23 hours ago
:::::: commit date: 6 months ago
compiler: s390-linux-gcc (GCC) 11.2.0
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
cppcheck possible warnings: (new ones prefixed by >>, may not real problems)
kernel/bpf/btf.c:5723:13: warning: Boolean result is used in bitwise operation. Clarify expression with parentheses. [clarifyCondition]
if (!uname ^ !uname_len)
^
>> kernel/bpf/btf.c:4596:38: warning: Either the condition 't?btf_type_vlen(t):MAX_BPF_FUNC_REG_ARGS' is redundant or there is pointer arithmetic with NULL pointer. [nullPointerArithmeticRedundantCheck]
args = (const struct btf_param *)(t + 1);
^
kernel/bpf/btf.c:4600:14: note: Assuming that condition 't?btf_type_vlen(t):MAX_BPF_FUNC_REG_ARGS' is not redundant
nr_args = t ? btf_type_vlen(t) : MAX_BPF_FUNC_REG_ARGS;
^
kernel/bpf/btf.c:4596:38: note: Null pointer addition
args = (const struct btf_param *)(t + 1);
^
vim +4596 kernel/bpf/btf.c
84ad7a7ab69f11 Jiri Olsa 2020-01-23 4576
9e15db66136a14 Alexei Starovoitov 2019-10-15 4577 bool btf_ctx_access(int off, int size, enum bpf_access_type type,
9e15db66136a14 Alexei Starovoitov 2019-10-15 4578 const struct bpf_prog *prog,
9e15db66136a14 Alexei Starovoitov 2019-10-15 4579 struct bpf_insn_access_aux *info)
9e15db66136a14 Alexei Starovoitov 2019-10-15 4580 {
38207291604401 Martin KaFai Lau 2019-10-24 4581 const struct btf_type *t = prog->aux->attach_func_proto;
3aac1ead5eb6b7 Toke Høiland-Jørgensen 2020-09-29 4582 struct bpf_prog *tgt_prog = prog->aux->dst_prog;
5b92a28aae4dd0 Alexei Starovoitov 2019-11-14 4583 struct btf *btf = bpf_prog_get_target_btf(prog);
38207291604401 Martin KaFai Lau 2019-10-24 4584 const char *tname = prog->aux->attach_func_name;
9e15db66136a14 Alexei Starovoitov 2019-10-15 4585 struct bpf_verifier_log *log = info->log;
9e15db66136a14 Alexei Starovoitov 2019-10-15 4586 const struct btf_param *args;
9e15db66136a14 Alexei Starovoitov 2019-10-15 4587 u32 nr_args, arg;
3c32cc1bceba8a Yonghong Song 2020-05-13 4588 int i, ret;
9e15db66136a14 Alexei Starovoitov 2019-10-15 4589
9e15db66136a14 Alexei Starovoitov 2019-10-15 4590 if (off % 8) {
38207291604401 Martin KaFai Lau 2019-10-24 4591 bpf_log(log, "func '%s' offset %d is not multiple of 8\n",
9e15db66136a14 Alexei Starovoitov 2019-10-15 4592 tname, off);
9e15db66136a14 Alexei Starovoitov 2019-10-15 4593 return false;
9e15db66136a14 Alexei Starovoitov 2019-10-15 4594 }
9e15db66136a14 Alexei Starovoitov 2019-10-15 4595 arg = off / 8;
9e15db66136a14 Alexei Starovoitov 2019-10-15 @4596 args = (const struct btf_param *)(t + 1);
523a4cf491b3c9 Dmitrii Banshchikov 2021-02-26 4597 /* if (t == NULL) Fall back to default BPF prog with
523a4cf491b3c9 Dmitrii Banshchikov 2021-02-26 4598 * MAX_BPF_FUNC_REG_ARGS u64 arguments.
523a4cf491b3c9 Dmitrii Banshchikov 2021-02-26 4599 */
523a4cf491b3c9 Dmitrii Banshchikov 2021-02-26 4600 nr_args = t ? btf_type_vlen(t) : MAX_BPF_FUNC_REG_ARGS;
38207291604401 Martin KaFai Lau 2019-10-24 4601 if (prog->aux->attach_btf_trace) {
9e15db66136a14 Alexei Starovoitov 2019-10-15 4602 /* skip first 'void *__data' argument in btf_trace_##name typedef */
9e15db66136a14 Alexei Starovoitov 2019-10-15 4603 args++;
38207291604401 Martin KaFai Lau 2019-10-24 4604 nr_args--;
38207291604401 Martin KaFai Lau 2019-10-24 4605 }
fec56f5890d93f Alexei Starovoitov 2019-11-14 4606
f50b49a0bfcaf5 KP Singh 2020-03-30 4607 if (arg > nr_args) {
f50b49a0bfcaf5 KP Singh 2020-03-30 4608 bpf_log(log, "func '%s' doesn't have %d-th argument\n",
f50b49a0bfcaf5 KP Singh 2020-03-30 4609 tname, arg + 1);
f50b49a0bfcaf5 KP Singh 2020-03-30 4610 return false;
f50b49a0bfcaf5 KP Singh 2020-03-30 4611 }
f50b49a0bfcaf5 KP Singh 2020-03-30 4612
6ba43b761c4134 KP Singh 2020-03-04 4613 if (arg == nr_args) {
f50b49a0bfcaf5 KP Singh 2020-03-30 4614 switch (prog->expected_attach_type) {
f50b49a0bfcaf5 KP Singh 2020-03-30 4615 case BPF_LSM_MAC:
f50b49a0bfcaf5 KP Singh 2020-03-30 4616 case BPF_TRACE_FEXIT:
9e4e01dfd3254c KP Singh 2020-03-29 4617 /* When LSM programs are attached to void LSM hooks
9e4e01dfd3254c KP Singh 2020-03-29 4618 * they use FEXIT trampolines and when attached to
9e4e01dfd3254c KP Singh 2020-03-29 4619 * int LSM hooks, they use MODIFY_RETURN trampolines.
9e4e01dfd3254c KP Singh 2020-03-29 4620 *
9e4e01dfd3254c KP Singh 2020-03-29 4621 * While the LSM programs are BPF_MODIFY_RETURN-like
9e4e01dfd3254c KP Singh 2020-03-29 4622 * the check:
9e4e01dfd3254c KP Singh 2020-03-29 4623 *
9e4e01dfd3254c KP Singh 2020-03-29 4624 * if (ret_type != 'int')
9e4e01dfd3254c KP Singh 2020-03-29 4625 * return -EINVAL;
9e4e01dfd3254c KP Singh 2020-03-29 4626 *
9e4e01dfd3254c KP Singh 2020-03-29 4627 * is _not_ done here. This is still safe as LSM hooks
9e4e01dfd3254c KP Singh 2020-03-29 4628 * have only void and int return types.
9e4e01dfd3254c KP Singh 2020-03-29 4629 */
5b92a28aae4dd0 Alexei Starovoitov 2019-11-14 4630 if (!t)
5b92a28aae4dd0 Alexei Starovoitov 2019-11-14 4631 return true;
5b92a28aae4dd0 Alexei Starovoitov 2019-11-14 4632 t = btf_type_by_id(btf, t->type);
f50b49a0bfcaf5 KP Singh 2020-03-30 4633 break;
f50b49a0bfcaf5 KP Singh 2020-03-30 4634 case BPF_MODIFY_RETURN:
6ba43b761c4134 KP Singh 2020-03-04 4635 /* For now the BPF_MODIFY_RETURN can only be attached to
6ba43b761c4134 KP Singh 2020-03-04 4636 * functions that return an int.
6ba43b761c4134 KP Singh 2020-03-04 4637 */
6ba43b761c4134 KP Singh 2020-03-04 4638 if (!t)
6ba43b761c4134 KP Singh 2020-03-04 4639 return false;
6ba43b761c4134 KP Singh 2020-03-04 4640
6ba43b761c4134 KP Singh 2020-03-04 4641 t = btf_type_skip_modifiers(btf, t->type, NULL);
a9b59159d338d4 John Fastabend 2020-06-24 4642 if (!btf_type_is_small_int(t)) {
6ba43b761c4134 KP Singh 2020-03-04 4643 bpf_log(log,
6ba43b761c4134 KP Singh 2020-03-04 4644 "ret type %s not allowed for fmod_ret\n",
6ba43b761c4134 KP Singh 2020-03-04 4645 btf_kind_str[BTF_INFO_KIND(t->info)]);
6ba43b761c4134 KP Singh 2020-03-04 4646 return false;
6ba43b761c4134 KP Singh 2020-03-04 4647 }
f50b49a0bfcaf5 KP Singh 2020-03-30 4648 break;
f50b49a0bfcaf5 KP Singh 2020-03-30 4649 default:
38207291604401 Martin KaFai Lau 2019-10-24 4650 bpf_log(log, "func '%s' doesn't have %d-th argument\n",
fec56f5890d93f Alexei Starovoitov 2019-11-14 4651 tname, arg + 1);
9e15db66136a14 Alexei Starovoitov 2019-10-15 4652 return false;
f50b49a0bfcaf5 KP Singh 2020-03-30 4653 }
fec56f5890d93f Alexei Starovoitov 2019-11-14 4654 } else {
5b92a28aae4dd0 Alexei Starovoitov 2019-11-14 4655 if (!t)
523a4cf491b3c9 Dmitrii Banshchikov 2021-02-26 4656 /* Default prog with MAX_BPF_FUNC_REG_ARGS args */
5b92a28aae4dd0 Alexei Starovoitov 2019-11-14 4657 return true;
5b92a28aae4dd0 Alexei Starovoitov 2019-11-14 4658 t = btf_type_by_id(btf, args[arg].type);
fec56f5890d93f Alexei Starovoitov 2019-11-14 4659 }
f50b49a0bfcaf5 KP Singh 2020-03-30 4660
9e15db66136a14 Alexei Starovoitov 2019-10-15 4661 /* skip modifiers */
9e15db66136a14 Alexei Starovoitov 2019-10-15 4662 while (btf_type_is_modifier(t))
5b92a28aae4dd0 Alexei Starovoitov 2019-11-14 4663 t = btf_type_by_id(btf, t->type);
a9b59159d338d4 John Fastabend 2020-06-24 4664 if (btf_type_is_small_int(t) || btf_type_is_enum(t))
9e15db66136a14 Alexei Starovoitov 2019-10-15 4665 /* accessing a scalar */
9e15db66136a14 Alexei Starovoitov 2019-10-15 4666 return true;
9e15db66136a14 Alexei Starovoitov 2019-10-15 4667 if (!btf_type_is_ptr(t)) {
9e15db66136a14 Alexei Starovoitov 2019-10-15 4668 bpf_log(log,
38207291604401 Martin KaFai Lau 2019-10-24 4669 "func '%s' arg%d '%s' has type %s. Only pointer access is allowed\n",
9e15db66136a14 Alexei Starovoitov 2019-10-15 4670 tname, arg,
5b92a28aae4dd0 Alexei Starovoitov 2019-11-14 4671 __btf_name_by_offset(btf, t->name_off),
9e15db66136a14 Alexei Starovoitov 2019-10-15 4672 btf_kind_str[BTF_INFO_KIND(t->info)]);
9e15db66136a14 Alexei Starovoitov 2019-10-15 4673 return false;
9e15db66136a14 Alexei Starovoitov 2019-10-15 4674 }
afbf21dce668ef Yonghong Song 2020-07-23 4675
afbf21dce668ef Yonghong Song 2020-07-23 4676 /* check for PTR_TO_RDONLY_BUF_OR_NULL or PTR_TO_RDWR_BUF_OR_NULL */
afbf21dce668ef Yonghong Song 2020-07-23 4677 for (i = 0; i < prog->aux->ctx_arg_info_size; i++) {
afbf21dce668ef Yonghong Song 2020-07-23 4678 const struct bpf_ctx_arg_aux *ctx_arg_info = &prog->aux->ctx_arg_info[i];
afbf21dce668ef Yonghong Song 2020-07-23 4679
afbf21dce668ef Yonghong Song 2020-07-23 4680 if (ctx_arg_info->offset == off &&
afbf21dce668ef Yonghong Song 2020-07-23 4681 (ctx_arg_info->reg_type == PTR_TO_RDONLY_BUF_OR_NULL ||
afbf21dce668ef Yonghong Song 2020-07-23 4682 ctx_arg_info->reg_type == PTR_TO_RDWR_BUF_OR_NULL)) {
afbf21dce668ef Yonghong Song 2020-07-23 4683 info->reg_type = ctx_arg_info->reg_type;
afbf21dce668ef Yonghong Song 2020-07-23 4684 return true;
afbf21dce668ef Yonghong Song 2020-07-23 4685 }
afbf21dce668ef Yonghong Song 2020-07-23 4686 }
afbf21dce668ef Yonghong Song 2020-07-23 4687
9e15db66136a14 Alexei Starovoitov 2019-10-15 4688 if (t->type == 0)
9e15db66136a14 Alexei Starovoitov 2019-10-15 4689 /* This is a pointer to void.
9e15db66136a14 Alexei Starovoitov 2019-10-15 4690 * It is the same as scalar from the verifier safety pov.
9e15db66136a14 Alexei Starovoitov 2019-10-15 4691 * No further pointer walking is allowed.
9e15db66136a14 Alexei Starovoitov 2019-10-15 4692 */
9e15db66136a14 Alexei Starovoitov 2019-10-15 4693 return true;
9e15db66136a14 Alexei Starovoitov 2019-10-15 4694
84ad7a7ab69f11 Jiri Olsa 2020-01-23 4695 if (is_string_ptr(btf, t))
84ad7a7ab69f11 Jiri Olsa 2020-01-23 4696 return true;
84ad7a7ab69f11 Jiri Olsa 2020-01-23 4697
9e15db66136a14 Alexei Starovoitov 2019-10-15 4698 /* this is a pointer to another type */
3c32cc1bceba8a Yonghong Song 2020-05-13 4699 for (i = 0; i < prog->aux->ctx_arg_info_size; i++) {
3c32cc1bceba8a Yonghong Song 2020-05-13 4700 const struct bpf_ctx_arg_aux *ctx_arg_info = &prog->aux->ctx_arg_info[i];
3c32cc1bceba8a Yonghong Song 2020-05-13 4701
3c32cc1bceba8a Yonghong Song 2020-05-13 4702 if (ctx_arg_info->offset == off) {
3c32cc1bceba8a Yonghong Song 2020-05-13 4703 info->reg_type = ctx_arg_info->reg_type;
22dc4a0f5ed11b Andrii Nakryiko 2020-12-03 4704 info->btf = btf_vmlinux;
951cf368bcb11d Yonghong Song 2020-07-20 4705 info->btf_id = ctx_arg_info->btf_id;
951cf368bcb11d Yonghong Song 2020-07-20 4706 return true;
3c32cc1bceba8a Yonghong Song 2020-05-13 4707 }
3c32cc1bceba8a Yonghong Song 2020-05-13 4708 }
9e15db66136a14 Alexei Starovoitov 2019-10-15 4709
951cf368bcb11d Yonghong Song 2020-07-20 4710 info->reg_type = PTR_TO_BTF_ID;
5b92a28aae4dd0 Alexei Starovoitov 2019-11-14 4711 if (tgt_prog) {
43bc2874e779c1 Toke Høiland-Jørgensen 2020-09-29 4712 enum bpf_prog_type tgt_type;
43bc2874e779c1 Toke Høiland-Jørgensen 2020-09-29 4713
43bc2874e779c1 Toke Høiland-Jørgensen 2020-09-29 4714 if (tgt_prog->type == BPF_PROG_TYPE_EXT)
43bc2874e779c1 Toke Høiland-Jørgensen 2020-09-29 4715 tgt_type = tgt_prog->aux->saved_dst_prog_type;
43bc2874e779c1 Toke Høiland-Jørgensen 2020-09-29 4716 else
43bc2874e779c1 Toke Høiland-Jørgensen 2020-09-29 4717 tgt_type = tgt_prog->type;
43bc2874e779c1 Toke Høiland-Jørgensen 2020-09-29 4718
43bc2874e779c1 Toke Høiland-Jørgensen 2020-09-29 4719 ret = btf_translate_to_vmlinux(log, btf, t, tgt_type, arg);
5b92a28aae4dd0 Alexei Starovoitov 2019-11-14 4720 if (ret > 0) {
22dc4a0f5ed11b Andrii Nakryiko 2020-12-03 4721 info->btf = btf_vmlinux;
5b92a28aae4dd0 Alexei Starovoitov 2019-11-14 4722 info->btf_id = ret;
5b92a28aae4dd0 Alexei Starovoitov 2019-11-14 4723 return true;
5b92a28aae4dd0 Alexei Starovoitov 2019-11-14 4724 } else {
5b92a28aae4dd0 Alexei Starovoitov 2019-11-14 4725 return false;
5b92a28aae4dd0 Alexei Starovoitov 2019-11-14 4726 }
5b92a28aae4dd0 Alexei Starovoitov 2019-11-14 4727 }
275517ff452a53 Martin KaFai Lau 2020-01-08 4728
22dc4a0f5ed11b Andrii Nakryiko 2020-12-03 4729 info->btf = btf;
275517ff452a53 Martin KaFai Lau 2020-01-08 4730 info->btf_id = t->type;
5b92a28aae4dd0 Alexei Starovoitov 2019-11-14 4731 t = btf_type_by_id(btf, t->type);
9e15db66136a14 Alexei Starovoitov 2019-10-15 4732 /* skip modifiers */
275517ff452a53 Martin KaFai Lau 2020-01-08 4733 while (btf_type_is_modifier(t)) {
275517ff452a53 Martin KaFai Lau 2020-01-08 4734 info->btf_id = t->type;
5b92a28aae4dd0 Alexei Starovoitov 2019-11-14 4735 t = btf_type_by_id(btf, t->type);
275517ff452a53 Martin KaFai Lau 2020-01-08 4736 }
9e15db66136a14 Alexei Starovoitov 2019-10-15 4737 if (!btf_type_is_struct(t)) {
9e15db66136a14 Alexei Starovoitov 2019-10-15 4738 bpf_log(log,
38207291604401 Martin KaFai Lau 2019-10-24 4739 "func '%s' arg%d type %s is not a struct\n",
9e15db66136a14 Alexei Starovoitov 2019-10-15 4740 tname, arg, btf_kind_str[BTF_INFO_KIND(t->info)]);
9e15db66136a14 Alexei Starovoitov 2019-10-15 4741 return false;
9e15db66136a14 Alexei Starovoitov 2019-10-15 4742 }
38207291604401 Martin KaFai Lau 2019-10-24 4743 bpf_log(log, "func '%s' arg%d has btf_id %d type %s '%s'\n",
9e15db66136a14 Alexei Starovoitov 2019-10-15 4744 tname, arg, info->btf_id, btf_kind_str[BTF_INFO_KIND(t->info)],
5b92a28aae4dd0 Alexei Starovoitov 2019-11-14 4745 __btf_name_by_offset(btf, t->name_off));
9e15db66136a14 Alexei Starovoitov 2019-10-15 4746 return true;
9e15db66136a14 Alexei Starovoitov 2019-10-15 4747 }
9e15db66136a14 Alexei Starovoitov 2019-10-15 4748
:::::: The code at line 4596 was first introduced by commit
:::::: 9e15db66136a14cde3f35691f1d839d950118826 bpf: Implement accurate raw_tp context access via BTF
:::::: TO: Alexei Starovoitov <ast@kernel.org>
:::::: CC: Daniel Borkmann <daniel@iogearbox.net>
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
next prev parent reply other threads:[~2021-08-29 7:30 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-08-28 21:42 kernel/bpf/btf.c:4596:38: warning: Either the condition 't?btf_type_vlen(t):MAX_BPF_FUNC_REG_ARGS' is redundant or there is pointer arithmetic with NULL pointer. [nullPointerArithmeticRedundantCheck] kernel test robot
2021-08-29 7:30 ` kernel test robot [this message]
-- strict thread matches above, loose matches on Subject: below --
2022-01-19 20:13 kernel test robot
2021-12-07 2:22 kernel test robot
2021-06-24 3:26 kernel test robot
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=a1e957a7-b0aa-f351-56c6-786853b14d1c@intel.com \
--to=yujie.liu@intel.com \
--cc=kbuild-all@lists.01.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.