uboot自定义命令造成data abort问题

uboot自定义命令造成自定义命令后其他命令执行出现data abort

问题现象

添加自定义命令后,自定义命令可以正常运行,但是之后的命令和tab补全都会出现data abort

直接原因

command.h和common.h未按顺序进行引用导致U_BOOT_CMD宏中的NULL被错误定义

#define U_BOOT_CMD(_name, _maxargs, _rep, _cmd, _usage, _help)		\
	U_BOOT_CMD_COMPLETE(_name, _maxargs, _rep, _cmd, _usage, _help, NULL)
  • 错误方式:
    在这里插入图片描述
  • 正确方式
    在这里插入图片描述

为什么会产生顺序问题

在这里插入图片描述
可以看到,common.h和command.h都会应用stddef.h
由此得到,当command.h在前时

  1. command.h内设置NULL为0,stddef.h内_LINUX_STDDEF_H被定义
  2. 到common.h引入时,_LINUX_STDDEF_H已被定义,无法将NULL定义为(void*)0

为什么出现data abort

struct cmd_tbl_s {
	char		*name;		/* Command Name			*/
	int		maxargs;	/* maximum number of arguments	*/
	int		repeatable;	/* autorepeat allowed?		*/
					/* Implementation function	*/
	int		(*cmd)(struct cmd_tbl_s *, int, int, char * const []);
	char		*usage;		/* Usage message	(short)	*/
	char		*help;		/* Help  message	(long)	*/
	/* do auto completion on the arguments */
	int		(*complete)(int argc, char * const argv[], char last_char, int maxv, char *cmdv[]);
};

U_BOOT_CMD宏服务于这个结构体,作为命令表的一行。

complete是个函数指针,但是NULL错误的定义会导致0直接被传给complete而不是(void*)0。进而在后续使用中出现异常的指针访问。

PS:可自行搜索 C语言中0与空指针;以及在CPP中 0与空指针,应该就可以理解了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值