1. ホーム
  2. c

[解決済み] スタックアロケーションで未初期化の値が作成されました。

2022-02-15 15:43:06

質問

int main(){

char *input = NULL;
char *line[2048];
size_t inputChars = 0;
size_t bufferSize = 0;

char *command = NULL;
char *arguments[2048];

printf(":");
fflush(stdout);


while((inputChars = getline(&input , &bufferSize , stdin)) > 0){

    memset(line, '\0' , (sizeof *line * sizeof line[0]) );
    memset(arguments, '\0' , (sizeof *arguments * sizeof arguments[0]));

    if(inputChars == -1){

        clearerr(stdin);
    }
    else{
        parseLine(input,line);

        command = line[0];

        int i = 0;
        int j = 1;

        while(line[j] != NULL)
        {
            arguments[i] = line[j];
            i++;
            j++;
        }

        if((*line[0] != '#') && (*line[0] != '\n'))
        {
            runCommand(command,arguments);
        }


        printf(":");
        fflush(stdout);

    }

    input = NULL;
  }
}
int isBackground(char* args[])
{
    int i = 0;
    int pos = 0;
    while (args[i] != NULL)
    {
        pos++;
        i++;
    }
    if (*args[pos - 1] == '&')
    {
        background++;
        return true;
    }
    else return false;
}

void runCommand(char* cmd, char* args[])
{
    printCommandLine(cmd, args);

    if (isBackground(args))
    {
        printf("Background Processes: %i\n",background);

    }
}

void printCommandLine(char* cmd, char* args[])
{

    printf("Command: %s\n",cmd);

    printf("Arguments:\n");

    int i = 0;

    while (args[i] != NULL)
    {
        printf("%s\n",args[i]);
        i++;
    }
}

ヴァリグリンの結果

xcodeの出力です。

どこで間違っているのかわかりません。私は、引数のリストを持つコマンドを受け入れることができるコマンドラインのためのいくつかの簡単なコードを書いています。プログラムは、長さ <= 7 の文字列配列に対して正常に動作し、このサイズのコマンドの最初の入力の後は、すべてのコマンド配列に対して動作します。どこで初期化されていない値を使用しているのかがわかりません。コードが壊れると、引数配列をループするときに不正なアクセスが発生します。私はそれが引数配列を埋めるmainのwhileループに関係しているかもしれないと思うが、私は間違っているかもしれない。本当に困っています。何かアイデアがあれば、あなたの助けやアドバイスをありがとうございました。

解決するには?

memset(arguments, '\0' , (sizeof *arguments * sizeof arguments[0]))

これは、初期化されていない値を引き起こすあなたのコードの問題です。

*arguments と同じです。 arguments[0] . そして sizeof はどちらも sizeof(char*) .

つまり、バッファの中のいくつかのエントリだけを初期化していることになります。

必要なのは

memset(arguments, '\0', sizeof(arguments));

前の行も同様

memset(line, '\0', sizeof(line));