2016-09-13 18 views
0

在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。

+1

你是否包含聲明'strdup()'的頭文件? – Barmar

+0

顯示完整的代碼。 –

+1

看起來問題出現在第113行的執行過程中......您的示例沒有顯示如何定義「z_adapter_build_date」,或者如何定義「ADAPTER_BUILD_DATE」... – TonyB

回答

0

如果z_adapter_build_date是一些C++對象,使得分配到其觸發函數調用(從const char *賦值運算符,等),這可能是因爲其中的一些功能與正被溢出到堆棧串緩衝器工作,從而重挫的局部變量main恰好從寄存器溢出並進入堆棧幀。當

z_adapter_build_date = (char *)ADAPTER_BUILD_DATE; 

結合

-DADAPTER_BUILD_DATE=$(shell date) 

,尤其是你顯然要注入的日期,不過我還是要說:

1

這看起來非常可疑你看不出你的禮物會給你什麼ou,因爲我沒有看到從哪裏來的擴展ADAPTER_BUILD_DATE所需的引號是字符串文字。我認爲它不會在Linux上編譯,但如果AIX上的date命令返回全數字日期,那麼它可能會在那裏編譯。您可以考慮捕獲預處理輸出以查看實際發生的情況。

注意,順便說一句,如果-DADAPTER_BUILD_DATE沒有擴大到一個字符串,那麼你不該需要將其轉換爲char *。在文字衰減到指針後,這應該是它的類型。

無論如何,如果你想在你的makefile注入一個字符串通過宏觀,那麼你可能wnat更多的東西是這樣的:

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

雙引號需要通過帶入宏定義,但該選項需要通過shell引用刪除。單引號保護報價刪除的雙引號,而不是自己刪除。 make本身忽略所有的引號。

+0

我同意麻煩的診斷 - 和臨時解決方案 - 但我認爲它是缺少MCVE的東西,'問題必須更新(再次)',因此評論值得,而不是回答值得。但我很高興有人同意我的診斷。 –