libpngでのPNGファイルの読み込み方について質問です。


こちらのサイト(http://gmoon.jp/png/#program_reading)を参考にしながら、libpng(ver.1.6.8)を使ってPNGファイルを読み込むプログラムをVisualStudio2013で書いています。

プロジェクトのlibpngとのリンクは正常にできているのですが、PNGファイルのヘッダを読み込むところとIHDRチャンクから情報を取得するところ(*1)で、以下のようなウィンドウ(*2)が出てプログラムが止まってしまいます。

*1) - - - - - - - - -
png_read_info(png_ptr, info_ptr);
png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, &interlace_type, NULL, NULL);

*2) - - - - - - - - -
「ハンドルされない例外が 0x77188E19 (ntdll.dll) で発生しました(libpng_test1.exe 内): 0xC0000005: 場所 0x00000014 への書き込み中にアクセス違反が発生しました。」


インクルードしているヘッダは以下です。
#include <png.h>

関数の使い方が参考のサイトのバージョンとは違うのでしょうか?
こういった状況のlibpng関連の参考文献は全然見当たらず、にっちもさっちもいかなくなってしまったので質問いたしました。どうすればよいのでしょうか…。よろしくお願いいたします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2014/02/04 13:58:13

ベストアンサー

id:cx20 No.1

回答回数607ベストアンサー獲得回数108

場所 0x00000014 への書き込み中にアクセス違反が発生しました。

このエラーは、不正なメモリアクセスをした際に発生します。
恐らくは、今回のケースはメモリ確保されていない構造体のメンバ(0x14=20バイト目)にアクセスして落ちているものと推測されます。

以下は、事象説明の為の疑似的なコードになります。

typedef struct _struct_test
{
    char field1[10];
    char field2[10];
    char field3;
} struct_test;

void test()
{
    struct_test* p_test = NULL;
    p_test->field3 = 1;   // 0x00000014 への書き込み中にアクセス違反となる
}
<構造体 p_test のメモリレイアウト>
0x00000000 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
0x00000010 ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??
                       ^^ ← ここに書き込もうとするとアクセス違反となる

Release ビルドだと、エラー箇所が特定しづらいので、Debug 版で試してみてはいかがでしょうか。

どうしても、Release ビルド版で調査したいということでしたら、システム環境変数に
f:id:cx20:20140203015649p:image

SET _NT_SYMBOL_PATH=symsrv*symsrv.dll*c:\localsymbols*http://msdl.microsoft.com/download/symbols

を追加してみてください。

これは、デバッグシンボルと呼ばれるもので、これを追加することで、呼び出し履歴(コールスタック)に、C のランタイムの関数名や OS の API 名が表示されるようになり、どこで落ちているのかを調査するのに役立ちます。

■ シンボルを使用したデバッグ
http://msdn.microsoft.com/ja-jp/library/bb694540(v=vs.85).aspx

f:id:cx20:20140203022344p:image
ちなみに、今回のケースでは、ファイル読み込みの際に、落ちているとのことなので、構造体としては FILE ポインタが怪しい気がします。。。

例えば、VC++ で古い C のコードをコンパイルしようとすると、fopen 関数は fopen_s 関数に置き換えるように、警告が表示されるかと思います。

この時の、コードの置き換えが正しく行われているか、再度確認してみては如何でしょうか。

■ fopen_s、_wfopen_s
http://msdn.microsoft.com/ja-jp/library/z5hh6ee9.aspx

他3件のコメントを見る
id:cx20

試したところ、
fp が 0xfffffff0 の場合(恐らく、初期化されていない値の場合)に同じエラーが発生しました。
Anonymous さんのご指摘のように fopen がが失敗している可能性が高そうです。

2014/02/04 08:34:59
id:onigiriTurnA

お二人ともありがとうございます。

どうやらlibpngのビルド方法に問題があったようです。散々お騒がせいたしました。
結果的には関係ありませんでしたが、構造体のメモリアクセスの概念など、本当に勉強になりました。ありがとうございました。

2014/02/04 14:16:10

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません