2012-02-13 4 views
7

原因:宣言ハードコードされたのstd ::文字列は、私は、実行時の警告の原因となる私のプログラムに次の行を持っているバッファオーバーフロー

if (!is_directory("C:\\NGFMS_Debug\\Files") && !create_directories("C:\\NGFMS_Debug\\Files")) 

警告のテキストはそうです:「バッファオーバーランが発生しましたプログラムの内部状態を破損しているXXX.exeにあります。

「is_directory(...)」の呼び出しで警告が表示されます。私は文字列のスペースが割り当てられていないと推測していますが、このような構文は合法だと思いました。

is_directory機能は、ブースト/ filesystem.hppの一部であり、私は次の名前空間を使用しています:

using namespace boost; 
using namespace boost::filesystem; 
using namespace std; 

これはVS2005 C++でコンパイルなっています。何か案は?

更新

私は、カップルの異なるものを試してみましたが、コードを通じて段階と、ここで私が見つけたものです。

私はこれを行う場合は

char* path_chars_c; 
path_chars_c = "C:\\Debug\\Files"; 
string path_str_c(path_chars_c); 

は変数path_chars_cは、適切な文字列が含まれていますが、変数path_str_cは、初期化後にゴミが含まれています。だからここで文字列の初期化が壊れているようです。誰もこれを見たことがありますか?

+0

バッファオーバーフローによって例外が発生することはありません。実際に例外が発生している場合は、さらに情報を提供する必要があります。 – ildjarn

+0

@ildjarn私はWindowsのブレークポイントを見ています。それに応じて変更された投稿。 – Ian

+0

私は混乱しています。これはコンパイラの警告ですか?あなたは、そのままメッセージを投稿するべきです。 – Gabe

答えて

6

これは、boost :: filesystem :: is_directory()のかなり標準的な使用のように思われる驚くべきエラーです。問題が発生した場所を確認するためにデバッガを使用して試してみましたか?

NDEBUGを有効にしたライブラリとNDEBUGを無効にしたライブラリをリンクすると、問題が発生する可能性があります。特に、いくつかのboostデータ型では、デバッグが有効になっているときにいくつかの追加のデバッグフィールドが割り当てられます。したがって、デバッグがオフであると考えられるコードの1つでオブジェクトが作成された後で、デバッグが実行されていると考えられる別のコードによって使用された場合、ランダムなメモリエラー(バッファオーバーフローなど)が発生する可能性があります。

+0

うわー、それは非常に良い推測でした。 DEBUGモードですべてがコンパイルされていることを確認して固定しました。 – Ian

関連する問題