2012-01-26 32 views
0

json_object * jobj = json_tokener_parse(my-> src)を使用して500バイトを超える文字列を解析しようとしています。 my-> srcが文字列が含まれていますが、デバッグにGDBを使用している間、私はJSON-Cライブラリファイルのいずれかで、以下のエラーを取得しています。ここでjson-cライブラリのエラー

Program received signal SIGSEGV, Segmentation fault. 
json_object_get_object (jso=0xfffffffc) at json_object.c:255 
255  json_object.c: No such file or directory. 
     in json_object.c 

誰もが間違っているかもしれないものを、私に知らせることができます。

+0

255行目のjson_object.cは何をしますか? –

+0

'my-> src'の内容は正確に何ですか? –

+0

struct lh_table * json_object_get_object(struct json_object * jso) { if(!jso)がNULLを返します。 スイッチ(jso-> o_type){ ケースjson_type_object: return jso-> o.c_object; デフォルト: NULLを返します。 } }上記のコード部分の上に – user537670

答えて

1

セグメンテーションフォールトは、ダブルfreeなどの管理されていないメモリ、または場合によっては終了していない文字列、バッファオーバーラン、またはjson-cのメモリ管理エラーを示します。特に、セグメンテーション・フォールトの前にメモリ破損が発生する可能性があり、JSON入力をデコードするとランダムに表示される可能性があります。

は、私は強く、デバッガなどgdbでプログラムを実行するように助言、および/またはsegmentaion障害の前にメモリ管理エラーがありますメモリ・アクセス・チェッカーなどvalgrind、。

+0

+1は「セグメンテーションフォルトの前に発生する可能性があります。この問題はおそらくライブラリにはないでしょうが(時にはそうかもしれませんが)。 –

+0

@ChrisLutz:サイズが500バイト未満の場合、問題なく動作します。 – user537670

+0

@ user537670デモファイル(JSON +簡易Cコード)を[pastebin.com](http://pastebin.com)程度にアップロードできますか?コードや入力がなければ、私たちは推測して一般的なヒントを与えることができます。 – phihag

2

あなたがのためにテストする:何かを行う前に

if (is_error(jso)) { 
    // handle error here 
} 

。どんな理由であれ、ライブラリはnullの代わりに偽のポインタを返し、実際にはこれを記録しません(is_errorはjson/bits.hで定義されています)。

0

json_tokener_parse()の代わりにjson_tokener_parse_verbose()を使用してみてください。

これは、json_tokener_parse_verbose()がnullポインタを返し、is_error()によってピックアップされるように、私にとってはうまくいきました。

関連する問題