2

次のプログラムがありますhttp://ideone.com/1RPs8E。ログ ファイルに行を出力する可変長関数 tlog を使用します。出力される行のレベル、ファイル名、デバッグ情報の行と関数、および printf の形式と引数のリストを受け取ります。

void tlog(int level, const char *file, int line, const char *fun, const char *fmt, ...)

現在のファイル、行、および関数に対して tlog 関数を呼び出す LOGL マクロも使用します。

#define LOGL(level, fmt, ...) tlog(level, __FILENAME__, __LINE__, __FUNCTION__, fmt, ##__VA_ARGS__)

たとえば、LOGL マクロを使用するさまざまなマクロ:

#define DEBUGEX(fmt, ...) LOGL(LDEBUGEX, fmt, ##__VA_ARGS__)
#define DEBUG(fmt, ...) LOGL(LDEBUG, fmt, ##__VA_ARGS__)
#define INFO(fmt, ...)  LOGL(LINFO, fmt, ##__VA_ARGS__)

valgrind でプログラムを実行する場合:

$ valgrind -v --track-origins=yes ./t

次のエラーが表示されます: 150 行目 (DEBUGEX マクロを使用した場合) に「スタック割り当てによって初期化されていない値が作成されました」。完全なログはこちら: http://pastebin.com/rZu4nkHd

コードの問題は何ですか?私にとっては大丈夫のようです。tlog 関数とそれを呼び出すすべてのマクロから level パラメータを削除すると、エラーは発生しなくなります。

Archlinux では gcc 4.8.2、Ubuntu 12.04.3 では gcc 4.6.3 でテスト済み

4

2 に答える 2