2017-07-03 3 views
1

プログラムはgetsocknameまで実行され、戻り値は-1で、errnoは9です(EBADF、不正なファイル記述子)。しかし、Androidアプリに組み込まれたコードは順調に進んでいます。getsocknameは-1を返し、errnoはEBADFですか?

void sysLibCSendHookHandler(CPUState* env, int isStart){ 

if(isStart){ 
    int fd = env->regs[0]; 
    int buf = env->regs[1]; 
    int len = env->regs[2]; 
    int flags = env->regs[3]; 
    DECAF_printf("xxxxx send(%d, %p, %d, %d)\n", fd, buf, len, flags); 
    extern int errno; 
    struct sockaddr_un sock_addr; 
    socklen_t sock_addr_len; 
    sock_addr_len = sizeof(sock_addr); 
    int t = getsockname(fd, (struct sockaddr*)&sock_addr, &sock_addr_len); 
    DECAF_printf("fd:%d",fd);} 
+0

* "しかし、アンドロイドアプリで計測されたコードはうまくいく..." * - これはシミュレータに問題があることを意味しますか? – jww

+1

'EBADF'は' getsockname() 'に渡されたファイル記述子が無効であることを意味します。このコードは*あなたが何らかの理由で 'send()'関数をフックしていることを意味しています、そうですか?どのくらい正確に?このコードは、パラメータがCPUレジスタに渡されていると仮定していますが、通常はスタックに渡されます。あなたは 'send()'パラメータが 'env-> regs []'にまったく格納されていると思いますか? –

答えて

2

未定義の動作でこのコードの結果:

extern int errno; 

7.5 ごとのエラー< ERRNO.H the C Standardの>(太字の部分に注意してください):

ヘッダは、いくつかの定義マクロ、すべて に関連するエラー条件の報告。

マクロはタイプint、別個 正の値と定数式を整数に展開し、#if前 ディレクティブに使用するのに適している

EDOM 
EILSEQ 
ERANGE 

あります。そしてintと スレッドローカル記憶域期間、いくつかのライブラリ関数によって 正のエラー番号に設定された値型を持つ変更左辺値に拡張

errno 

実際のオブジェクトにアクセスするためにマクロ の定義が抑制されている場合、 またはプログラムの名前がerrnoの識別子を定義する場合、 の動作は未定義です。

Google Android source codeによると、errnoはケースであること、あなたはextern int errnoに表示値が無意味であることを

extern int *__geterrno(void); 

#define errno (*__geterrno()) 

として定義されたマクロです。

関連する問題