gpt4 book ai didi

c - AIX 中因 argv 为空值而出现段错误

转载 作者:行者123 更新时间:2023-11-30 15:05:57 24 4
gpt4 key购买 nike

在 AIX 6.1 上,我有一段代码,在调用 strdup 后,argv 以某种方式设置为 NULL。完全相同的代码可以在 Linux、HPUX 和 Solaris 上运行。

这是生产代码的摘录,我在其中获取核心转储:

Makefile    
....
CFLAGS += -I$(SERVER)/shared/interfaces \
-DADAPTER_BUILD_DATE="\"$(shell date)\""
....

全局.c

...
char *z_adapter_build_date = NULL;
...

共享.c

...
extern char *z_adapter_build_date;
...

测试.c

   int main(int l_argc, char **l_argv)
{

char *lbasename;
char *ltmp;
z_adapter_build_date = (char *)ADAPTER_BUILD_DATE;

ltmp = strdup(l_argv[0]);
lbasename = basename(ltmp);
if ((zprogname = strdup(lbasename)) == NULL)
{
printf("strdup failed:\n");
exit(1);
}

....


$ dbx ./test
warning: tpm_builtin_fn.cc is newer than /xps/ceal_800/rel/server/lib/libsql.so
warning: trans_tux.cc is newer than /xps/ceal_800/rel/server/lib/libsql.so
warning: varmap.cc is newer than /xps/ceal_800/rel/server/lib/libsql.so

(dbx) [1] stop in main
(dbx)
(dbx) r 1
[1] stopped in main at line 113 in file "/u01/xps/800/src/test.c" ($t1)
113 z_adapter_build_date = (char *)ADAPTER_BUILD_DATE;
(dbx) p l_argv[1]
"1"
(dbx) n
stopped in main at line 115 in file "/u01/xps/800/src/test.c" ($t1)
115 ltmp = strdup(l_argv[0]);
(dbx) p l_argv[1]
(nil)

但是,这可能是一个转移注意力的问题,上面的 cc 文件版本不匹配,我想这可能是原因之一。我不太确定是什么导致该值变为 NULL。

最佳答案

这看起来非常可疑:

-DADAPTER_BUILD_DATE=$(shell date)  

,尤其是与

结合使用时
z_adapter_build_date = (char *)ADAPTER_BUILD_DATE;

您显然想注入(inject)一个日期字符串,但我不知道您所提供的内容将如何给您提供这个,因为我不知道从哪里来制作所需的引号ADAPTER_BUILD_DATE 的扩展是字符串文字。我认为它根本无法在 Linux 上编译,但如果 AIX 上的 date 命令返回全数字日期,那么它可能会在那里编译。您可以考虑捕获预处理的输出以查看实际发生的情况。

请注意,顺便说一下,如果 -DADAPTER_BUILD_DATE did 扩展为字符串文字,那么您不需要将其转换为 char * 。当文字衰减为指针后,它应该已经是它的类型了。

无论如何,如果您尝试通过该宏注入(inject)字符串文字,那么您可能会在 makefile 中看到更像这样的内容:

-DADAPTER_BUILD_DATE='"$(shell date)"'

双引号需要带入宏定义中,但选项需要通过 shell 去掉引号。单引号保护双引号不被删除,而双引号本身被删除。 make 本身会忽略所有引号。

关于c - AIX 中因 argv 为空值而出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39477077/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com