`realloc():不明なサイズの入力を処理しようとしているときに無効な次のサイズ`

Fedora

次のコードがあります。関数は、渡されたget_unlimited_input場合NULL新しい文字列を割り当てます。それ以外の場合は、既存の文字列に文字を追加するだけです。最終的には、余分なバイトを切り捨てます。多くの再割り当てのテストケースDEFAULT_BUFFER_SIZEに設定され5ました)

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#define DEFAULT_BUFFER_SIZE 5

char *get_unlimited_input(char *buffer) {
    size_t current_size;
    if (buffer == NULL) {
        buffer = malloc(DEFAULT_BUFFER_SIZE * sizeof(char));
        current_size = DEFAULT_BUFFER_SIZE;
    } else {
        current_size = strlen(buffer) + DEFAULT_BUFFER_SIZE;
    }
    char *cursor = buffer + current_size - DEFAULT_BUFFER_SIZE;
    for (;;) {
        int current = getchar();
        *cursor = (char)current;
        cursor++;
        if (current == '\n' || current == EOF)
            break;
        if (cursor >= buffer + current_size) {
            current_size += DEFAULT_BUFFER_SIZE;
            buffer = realloc(buffer, current_size);
            cursor = buffer + current_size - DEFAULT_BUFFER_SIZE;
        }
    }
    *cursor = '\0';
    buffer = realloc(buffer, cursor - buffer);
    return buffer;
}

int main() {
    printf(">");
    char *buffer = get_unlimited_input(NULL);
    printf(">");
    get_unlimited_input(buffer);
}

ほとんどの場合、問題なく動作しますが、最初に117文字を渡し、次に12文字を渡すと、クラッシュします。

>.....................................................................................................................
>............
realloc(): invalid next size
Aborted (core dumped)
python3 -c "print('.'*117+'\n'+'.'*12)" | ./_buffer
realloc(): invalid next size
Aborted (core dumped)

何が問題ですか?

chqrlie

コードには複数の問題があり、診断が示すようにヒープが破損します。

  • 現在割り当てられているサイズに関するあなたの仮定は正しくcurrent_size = strlen(buffer) + DEFAULT_BUFFER_SIZE;ありません楽観的すぎます。バッファをcursor - buffer返す前バイトに再割り当てするため、文字列の最後にスラックはありません。

  • あなたはをテスト'\n'し、EOF配列にバイトを格納した後。これは改行の意図された動作である可能性がありますがEOF、文字ではない、については正しくありません。

  • bufferwithの再割り当てbuffer = realloc(buffer, cursor - buffer);も正しくありませんcursor。nullターミネータを指しているため、のサイズを使用してcursor + 1 - buffer、割り当てられたブロック内にnullターミネータを保持する必要があります。

変更されたバージョンは次のとおりです。

#include <stdio.h>
#include <stdlib.h>

#define DEFAULT_BUFFER_SIZE  16  /* use address alignment as incremental size */

char *get_unlimited_input(char *buffer) {
    size_t current_size, pos;
    char *p;

    if (buffer == NULL) {
        pos = 0;
        current_size = DEFAULT_BUFFER_SIZE;
        buffer = malloc(DEFAULT_BUFFER_SIZE);
        if (buffer == NULL)
            return NULL;
    } else {
        pos = strlen(buffer);
        current_size = pos + 1;
    }
    for (;;) {
        int c = getchar();
        if (c == EOF || c == '\0')
            break;
        if (pos + 1 == current_size) {
            // reallocate the buffer
            current_size += DEFAULT_BUFFER_SIZE;
            p = realloc(buffer, current_size);
            if (p == NULL)
                break;
            buffer = p;
        }
        buffer[pos++] = (char)c;
        if (c == '\n')
            break;
    }
    buffer[pos] = '\0';
    p = realloc(buffer, pos + 1);
    return (p != NULL) ? p : buffer;
}

int main() {
    printf("> ");
    char *buffer = get_unlimited_input(NULL);
    printf("got: %s\n", buffer);
    printf("> ");
    get_unlimited_input(buffer);
    printf("got: %s\n", buffer);
    return 0;
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

以前は不明なサイズの文字列でsprintfを使用して、free()の無効な次のサイズを生成してみてください

分類Dev

ユーザーが入力したサイズの長方形と同じサイズになるようにCanvasの幅と高さの属性を生成する

分類Dev

PythonでAPIラッパーを開発しているときに、無効な入力をどのように処理する必要がありますか?

分類Dev

make_blobs関数を使用してサイズが異なる2つのクラスターを作成しているときにErrorと入力します

分類Dev

vector <int>をvector <vector <int >>にプッシュしている間、SIGABRT --free():無効な次のサイズ(高速)

分類Dev

divのサイズを取得しようとしているときのバグ

分類Dev

コンパイル段階でc ++は不明なサイズの配列割り当てをどのように処理しますか

分類Dev

realloc()無効な次のサイズ-もう一度、私は知っています

分類Dev

reallocの問題-「無効な次のサイズ」

分類Dev

C realloc:無効な次のサイズ、aSanはheap-use-after-freeと言います

分類Dev

Java Swing:GridBagLayout列が大きくなるように設定されているときに、JListのアイテム幅を無視して、JListのサイズを適切に変更するにはどうすればよいですか?

分類Dev

ユーザーが画像のサイズを変更しようとしたときに画像が移動しないようにしてください

分類Dev

アプリに表示する画像サイズ-画像のサイズを縮小しようとしています

分類Dev

配列のサイズが変更されると無効になる配列要素へのポインタを処理するにはどうすればよいですか?

分類Dev

ヒープのサイズを増やしても機能しない場合、OOME例外を処理するにはどうすればよいですか?

分類Dev

ajaxクエリがサイズ値を変更しているときに入力幅のサイズをアニメーション化する方法

分類Dev

固定サイズのベクトルとしてのタプルの効率的な処理

分類Dev

iOSのInstagramにリダイレクトURIを入力するときに「有効なウェブサイトを入力してください」

分類Dev

配列の前半をサイズが不明な後半とどのように交換しますか

分類Dev

MS Wordは不足しているフォントサイズをどのように処理しますか?

分類Dev

PILが画像のサイズを大きくしないようにする

分類Dev

なぜこのような長いデータ型のメモリサイズを処理することに成功するのですか?

分類Dev

透かしを追加しているときにFFMPEGgifのサイズ変更が機能しない

分類Dev

mallocとfreeの使用:無効な次のサイズエラー

分類Dev

グラフ領域のサイズを変更したときにサイズが変更されないように、プロット領域のサイズをロックするにはどうすればよいですか?(Excel / Office 365)

分類Dev

条件付きジャンプまたは移動は、初期化されていない値とサイズの無効な書き込みに依存します

分類Dev

「サイズ8の読み取りが無効です」-Valgrind。構造体に他の構造体からのデータを入力しようとしています

分類Dev

fread()を整数に変換しているときに、ファイルサイズが4バイトの倍数でない場合はどうなりますか?

分類Dev

UITextViewの境界を変更しているときに、TextContainerのサイズが変更されない

Related 関連記事

  1. 1

    以前は不明なサイズの文字列でsprintfを使用して、free()の無効な次のサイズを生成してみてください

  2. 2

    ユーザーが入力したサイズの長方形と同じサイズになるようにCanvasの幅と高さの属性を生成する

  3. 3

    PythonでAPIラッパーを開発しているときに、無効な入力をどのように処理する必要がありますか?

  4. 4

    make_blobs関数を使用してサイズが異なる2つのクラスターを作成しているときにErrorと入力します

  5. 5

    vector <int>をvector <vector <int >>にプッシュしている間、SIGABRT --free():無効な次のサイズ(高速)

  6. 6

    divのサイズを取得しようとしているときのバグ

  7. 7

    コンパイル段階でc ++は不明なサイズの配列割り当てをどのように処理しますか

  8. 8

    realloc()無効な次のサイズ-もう一度、私は知っています

  9. 9

    reallocの問題-「無効な次のサイズ」

  10. 10

    C realloc:無効な次のサイズ、aSanはheap-use-after-freeと言います

  11. 11

    Java Swing:GridBagLayout列が大きくなるように設定されているときに、JListのアイテム幅を無視して、JListのサイズを適切に変更するにはどうすればよいですか?

  12. 12

    ユーザーが画像のサイズを変更しようとしたときに画像が移動しないようにしてください

  13. 13

    アプリに表示する画像サイズ-画像のサイズを縮小しようとしています

  14. 14

    配列のサイズが変更されると無効になる配列要素へのポインタを処理するにはどうすればよいですか?

  15. 15

    ヒープのサイズを増やしても機能しない場合、OOME例外を処理するにはどうすればよいですか?

  16. 16

    ajaxクエリがサイズ値を変更しているときに入力幅のサイズをアニメーション化する方法

  17. 17

    固定サイズのベクトルとしてのタプルの効率的な処理

  18. 18

    iOSのInstagramにリダイレクトURIを入力するときに「有効なウェブサイトを入力してください」

  19. 19

    配列の前半をサイズが不明な後半とどのように交換しますか

  20. 20

    MS Wordは不足しているフォントサイズをどのように処理しますか?

  21. 21

    PILが画像のサイズを大きくしないようにする

  22. 22

    なぜこのような長いデータ型のメモリサイズを処理することに成功するのですか?

  23. 23

    透かしを追加しているときにFFMPEGgifのサイズ変更が機能しない

  24. 24

    mallocとfreeの使用:無効な次のサイズエラー

  25. 25

    グラフ領域のサイズを変更したときにサイズが変更されないように、プロット領域のサイズをロックするにはどうすればよいですか?(Excel / Office 365)

  26. 26

    条件付きジャンプまたは移動は、初期化されていない値とサイズの無効な書き込みに依存します

  27. 27

    「サイズ8の読み取りが無効です」-Valgrind。構造体に他の構造体からのデータを入力しようとしています

  28. 28

    fread()を整数に変換しているときに、ファイルサイズが4バイトの倍数でない場合はどうなりますか?

  29. 29

    UITextViewの境界を変更しているときに、TextContainerのサイズが変更されない

ホットタグ

アーカイブ