1. ホーム
  2. c

[解決済み】valgrind - サイズ8のブロックが割り当てられた後、アドレス ---- が0バイトになる。

2022-01-19 07:58:49

質問

まず、私が知っているのは 同様 の質問があります。しかし、私は本当に原始的なCのデータ型でより一般的な簡単な質問をしたいです。ということで、こちらです。

main.c これらの文字列を入力するための関数を呼び出します。

int
main (int argc, char *argv[]){

    char *host = NULL ;
    char *database ;
    char *collection_name;
    char *filename = ""; 
    char *fields = NULL;
    char *query = NULL;
    ...

    get_options(argc, argv, &host, &database, &collection_name, &filename, 
                &fields, &query, &aggregation);

内部 {コード :

{{コード

私のプログラムはうまくいくのですが、Valgrindが間違ったやり方をしていると教えてくれました。

get_options

エラーについて説明してください if (*filename == NULL ) { *filename = (char*)realloc(*filename, strlen(*collection_name)*sizeof(char)+4); strcpy(*filename, *collection_name); strcat(*filename, ".tde"); # line 69 } ? どうすればこの問題を解決できますか?

解決するには?

{コード ヌル文字を追加する ==8608== Memcheck, a memory error detector ==8608== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al. ==8608== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info ==8608== Command: ./coll2tde -h localhost -d test -c test ==8608== ==8608== Invalid write of size 1 ==8608== at 0x403BE2: get_options (coll2tde.c:69) ==8608== by 0x402213: main (coll2tde.c:92) ==8608== Address 0xa2edd18 is 0 bytes after a block of size 8 alloc'd ==8608== at 0x4C28BED: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==8608== by 0x4C28D6F: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==8608== by 0x403BBC: get_options (coll2tde.c:67) ==8608== by 0x402213: main (coll2tde.c:92) . スペースの確保を忘れています。

Address 0xa2edd18 is 0 bytes after a block of size 8 alloc'd

5文字分のスペースを追加する必要があります。4文字分 strcpy サフィックス、そしてもう1つは '\0' ターミネーターです。現在のコードでは4つしか割り当てられていないので、最後の書き込みは新しいファイル名用に割り当てたブロックの直後(つまりその0バイト後)のスペースに行われることになります。

注意してください。 あなたのコードには共通の問題があります。 *filename = (char*)realloc(*filename, strlen(*collection_name)*sizeof(char)+5); を再割り当てされるポインタに直接指定します。これは、次のような場合には問題ありません。 {コード {コード は成功しますが、失敗するとメモリリークが発生します。このエラーを修正するためには、以下の結果を保存する必要があります。 ".tde" を別の変数に入れ、それをチェックし '\0' に値を代入する前に realloc

realloc

に直接割り当てる。 realloc のポインタはメモリリークを引き起こします。 NULL