1

インターネット上で何も見つけられなかった質問。Linux Wheezy ディストリビューション (Raspberry Pi ですが、関係ありません) で実行されているこの小さな C コードがあります。

void function(const char * command)
{

    // Define commands for in between parameters
    char commandPre[] = "echo ";

    // Get the lengths of the strings
    int len= strlen(command) + strlen(commandPre);


    // Allocate the command
    char * fullCommand = (char *) malloc(len * sizeof(char));

    // Build the command
    strcat(fullCommand, commandPre);
    strcat(fullCommand, command);


    // Execute command
    system(fullCommand);

    // Free resources
    free(fullCommand);
}

今、このコードをデーモン プログラムから実行しています。しかし、 free(fullCommand) に2回到達すると(プログラムで関数が2回呼び出されると)、プログラムがクラッシュして存在します。free(fullCommand) を削除すると、期待どおりに動作します。

私の質問は次のとおりです: system() はすでに "fullCommand" を解放していますか? もしそうなら、なぜ1回目ではなく2回目でうまくいくのでしょうか? ここで何か不足していますか?

PS 実際には、コマンドは strcat された複数の文字列で構成されていますが、上記は最も基本的な形式のコードです

4

2 に答える 2

3

文字列ターミネータにスペースを割り当てていないため、バッファ オーバーランが発生しています。

また、の戻り値をキャストしないmalloc()でください。割り当てが機能したと仮定する前に、戻り値を確認してください。

また、あなた自身の答えで指摘しているようにstrcat()、バッファが空の文字列にならないため、新しく割り当てられたバッファでの使用は壊れています。先に取り上げなくてすみません。

于 2013-06-04T11:53:10.750 に答える