0

AIX 6.1 では、 への呼び出し後に が何らかの形で にargv設定されるコードがあります。まったく同じコードが、Linux、HPUX、および Solaris で動作していました。NULLstrdup

コア ダンプを取得しているプロダクション コードからの抜粋を次に示します。

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

global.c

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

共有.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ファイルのバージョンに不一致があり、それが1つの理由であると思います. 値が NULL になる原因がよくわかりません。

4

2 に答える 2

0

z_adapter_build_date代入が関数呼び出し ( からの代入演算子など) をトリガーするような C++ オブジェクトがある場合const char *、これらの関数の一部は、オーバーランしているスタック上の文字列バッファーで動作し、ローカル変数を破壊している可能性がありますmain。レジスタからスタック フレームにスピルされます。

于 2016-09-13T20:29:48.403 に答える