2016-08-06 35 views
0

私のKubuntuにboost :: filesystem :: exists()segfault関数があり、その理由がわかりません。ここでboost :: filesystem :: exists segfault on linux

は私の関数である。

if (!boost::filesystem::exists("./sthg")) 
{ 
    // .... 
} 

私はvalgrindのを確認し、彼はエラーがxstat.cである私に語った:35とエラーがシステムコールのparam(file_nameが)初期化されていないバイト(複数可)を含んでいる」です。 "ここで

は私のコンパイル行です:

g++ ... -o ... -lboost_system -lboost_filesystem 

EDIT 1:

ディレクトリを作成し、関数を呼び出す機能:ディレクトリを作成する機能

void TCPConnection::enable(void) 
{ 
    try { 
     StaticTools::CreateFolder("./clients"); 
    } catch (std::exception const& e) { 
     std::cerr << e.what() << std::endl; 
    } 
} 

を:

void StaticTools::CreateFolder(std::string const& path) 
{ 
    if (!boost::filesystem::exists(path)) {                               
     if (!boost::filesystem::create_directory(path)) { 
      throw (std::runtime_error("...")); 
     } 
    }                                          
} 

Valgrindのログイン: http://pastebin.com/gbzFDDNg

+4

最も可能性の高い説明は、あなたが実際に 'boost :: filesystem :: exists'に渡した文字列が無効であったということです。 2番目の可能性が高いのは、Boostのインストールが自己矛盾しているか、コアC++ランタイムライブラリと矛盾しているということです。これら2つのうちどれがどれであるかを理解するために、単なる断片ではなく、[最小、完全な例(https://stackoverflow.com/help/mcve)]を提供してください。 – zwol

+1

あなたが私たちに教えてくれる他のもの: 'dpkg-query -W -f 'の$ {db:Status-Abbrev} $ {Version} $ {Package} \ n' g ++ * libstdC++ *ブースト* libboost * | grep '^ ii' |列-t ';パッケージマネージャを介さずに手動でソフトウェアをインストールしているか(特にブーストかコンパイラか) 'valgrind'から得た完全なスタックトレースです。 – zwol

+3

ところで、ファイルが存在するかどうかをチェックするのはほとんどの場合間違いです。チェックに基づいて実行するチェックとアクションの間に、他のプログラムがファイルを作成または削除したり、小切手代わりに、ファイルを使ってやりたいことを行い、そのファイルがあるかどうかを確認してください。 (システムプリミティブ['open'](http://linux.die.net/man/3/open)にはこれに非常に便利なオプション' O_EXCL'がありますが、残念ながらstdioとiostreamsはそのオプションを公開していません)。 – zwol

答えて

1

1)ブースト::ファイルシステムの非常に不明瞭なドキュメントは、私はそれが意味考えるものを意味している場合、そのディレクトリを作成する関数は単純であれば、ので

void StaticTools::CreateFolder(std::string const& path) 
{ 
    boost::filesystem::create_directory(path); 
} 

をお読みくださいcreate_directoryが例外をスローせずに返された場合、ディレクトリは存在します。 (戻り値は、すでにディレクトリとして存在していた。あなたはおそらく気にしないディレクトリがちょうどを作成されているかどうかを示します。)

2)この関数の呼び出しは、本当に本当に

だった場合引数として文字列リテラル「./clients」と
StaticTools::CreateFolder("./clients"); 

『システムコールのparam STAT(file_nameが)初期化されていないバイト(複数可)を含む』本当に本当にvalgrindから放出された非常に最初のエラーは、その後、でした私はあなたが私かもしれないと言って残念ですブーストがC++ランタイムライブラリと矛盾してしまう不幸なケース。具体的には、あなたのlibstdc++.soがC++ 11 std::stringにデフォルト設定されているのに対し、libboost_filesystem.soはC++ 98 std::stringが期待されていると思います。これを修正するための良い方法はありません。ブーストやC++ランタイムの責任を負うKubuntuの人々がそれをしなければなりません。最小限の努力のパスはおそらくブーストの使用を止めることです。それは冗談ではない。

関連する問題