web-dev-qa-db-ja.com

glibcがmalloc()を検出しました:Cのメモリ破損

LinuxでCで記述されたコードをコンパイルしてコード化しようとすると、次のエラーメッセージが表示されます。

glibcがmalloc()を検出しました:メモリ破損

理由がわかりません...

substring()は、開始インデックスと長さを指定することにより、元の文字列の一部を返すだけです。例えばsubstring( "this is example"、0,4)= "this";

char *substring(char* str, int start, int length) {
    char *newString = (char *)malloc(length * sizeof(char));
    int i, x = 0;
    int end=start+length-1;
    for(i = start ; i <= end; i++){
        newString[x++] = str[i];
    }
    newString[x] = '\0';
    return newString;
}

getCharIndexFirst()は、指定された文字の最初の出現のインデックスを返すだけです。getCharIndexLast()は、指定された文字の最後の出現のインデックスを返すだけです。

以下は主な機能です。

//consoleCommand has the form of 'send MESSAGE ID', has the value from stdin

int firstSpace = getCharIndexFirst(consoleCommand,' ');
int lastSpace = getCharIndexLast(consoleCommand,' ');
int len = strlen(consoleCommand);

char *header = substring(consoleCommand,0,firstSpace);
printf("header is: %s\n",header);
char *cmd = substring(consoleCommand,firstSpace+1,lastSpace-firstSpace-1);
printf("command is: %s\n",cmd); // the code only runs up to here and output the error..
char *socketstr = substring(consoleCommand,lastSpace+1,len-lastSpace-1);
printf("socket is: %s\n",socketstr);

詳細はこちら:consoleCommandは通常stdinであり、「send MESSAGE ID」の形式で、MESSAGEが12文字の長さの場合にエラーが発生します...例:「このメッセージを送信4」、「このメッセージ'はcmdで、長さは12文字です。これによりエラーが発生します!他の長さでも問題なく動作します。3、4、24を試しました...

どんなヒントでもありがたいです、ありがとう!

6
Hugh H
newString[x] = '\0';

この時点で、xlengthと等しくなります。これは、割り当てたメモリの終わりを超えて1文字を書き込んでいることを意味します。もう1文字にスペースを割り当てる必要があります。

12
Katniss

終了する'\0'文字にスペースを割り当てないため、この文字を書き込むために割り当てをオーバーフローします。割り当てでもこの文字を数える必要があります。

char *newString = (char *)malloc((length + 1) * sizeof(char));
5
cdhowie