2016-07-12 16 views
-3

「セグメンテーションフォルト(コアダンプされた)」"FILE * pFile;"によるセグメンテーションフォルト(コアダンプ)?

と処理が中断されました。

お願いします。ここ

疑わしい部品コード

...

FILE *pFile; 
char buffer[100]; 
sprintf(buffer,"/var/www/html/%s.txt",topic); 

pFile = fopen(buffer,"w"); 

この問題は、中に発生する可能性が上記 (入力しなかった場合、他)

if(NULL == pFile){ 
    _mosquitto_log_printf(NULL, MOSQ_LOG_DEBUG,"open failure"); 
}else{ 
    fwrite(payload,1,sizeof(payload)-1,pFile); 
    _mosquitto_log_printf(NULL, MOSQ_LOG_INFO, "File context : %s", payload); 
} 
fclose(pFile); 

...

OS Ubuntu 14

+2

'payload'とは何ですか? –

+1

デバッグを使用してsegfaultの原因となった命令を確認しようとしましたか? – blatinox

+0

'topic'が十分な長さである場合、作成するテキストがバッファに収まらない場合があります。これはスタック上にあるかのように見えるので、バッファオーバーランはおそらく 'pFile'やその他の変数、おそらくリターンアドレスを破壊します。 IOW:古典的なバッファオーバーラン(悪意のある意図はありません)です。あなたが言ったように、問題はif-else節を入力する前に発生する可能性があります。 –

答えて

3

ヌルポインタの場合でも、fclosepFileを使用して呼び出します。無効なポインタ(ヌルポインタのような)または既に閉じられているFILE*を使用してfcloseを呼び出すと、は未定義となります。

fcloseを呼び出すのは、ポインタがNULLでない、つまりコードのelse句ではありません。

+0

恐ろしいです!あなたは私の間違いを指摘し、問題は解決しました、ありがとうございます。 – JimmyHo

関連する問題