在AIX 6.1上,我有一段代碼,argv
在調用strdup
後以某種方式設置爲NULL
。完全相同的代碼在Linux,HPUX和Solaris上工作。AIX中的分段錯誤argv的空值
下面是從生產代碼中我得到核心轉儲摘錄:
Makefile
....
CFLAGS += -I$(SERVER)/shared/interfaces \
-DADAPTER_BUILD_DATE="\"$(shell date)\""
....
global.c
...
char *z_adapter_build_date = NULL;
...
shared.c
...
extern char *z_adapter_build_date;
...
test.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。
你是否包含聲明'strdup()'的頭文件? – Barmar
顯示完整的代碼。 –
看起來問題出現在第113行的執行過程中......您的示例沒有顯示如何定義「z_adapter_build_date」,或者如何定義「ADAPTER_BUILD_DATE」... – TonyB