argv
在AIX 6.1 上,我有一段代码在NULL
调用strdup
. 完全相同的代码在 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。