Closed tkomatsu closed 3 years ago
https://github.com/tkomatsu/minishell/blob/27153c43f62bee549db5dd5f7c2169abaf9351b0/srcs/read/read_tokens.c#L42-L64 再帰からwhileのループ処理にして動くことを確認。 デバッグフラグを付けずにコンパイルするとセグフォが発生。
❯ ./minishell
WELCOME TO MINISHELL
> hello
[ 0]hello
> world
[ 0]hello
[ 1]world
> this
[ 0]hello
[ 1]world
[ 2]this
> is test
[ 0]hello
[ 1]world
[ 2]this
[ 3]is
[ 4]test
>
毎回連結リストの先頭を参照してしまっている。 https://github.com/tkomatsu/minishell/blob/27153c43f62bee549db5dd5f7c2169abaf9351b0/srcs/minishell.c#L55-L68 whileが回る度にリセットする必要がある。
https://github.com/tkomatsu/minishell/blob/2b379564fad6862166fc6c38ae04b44bc03c3fc3/srcs/read/read_tokens.c#L89-L98
read_tokens()
の呼び出し時に、連結リストを初期化するように変更。
デバグフラグなしだとセグフォが発生するのは改善せず。
minishell on dev_read [$!]
❯ make debug
Removing object files and program ...
█████████████████████
Compiled source files
████████████████████████████████████████████████████████████████████████
Compiled libft
Finish compiling minishell!
Try "./minishell" to use
Debug build done
minishell on dev_read [$!]
❯ lldb minishell
(lldb) target create "minishell"
Current executable set to '/Users/tkomatsu/Documents/42/minishell/minishell' (x86_64).
(lldb) r
Process 8741 launched: '/Users/tkomatsu/Documents/42/minishell/minishell' (x86_64)
WELCOME TO MINISHELL
> hello
Process 8741 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
frame #0: 0x0000000100001d08 minishell`test_tokens(tokens=0x00000001000e2b50) at minishell.c:24:33
21 for (int i = 0; tokens; i++)
22 {
23 token = (t_token*)tokens->content;
-> 24 printf("[%2d]%s\n", i, token->word);
25 tokens = tokens->next;
26 }
27 }
Target 0: (minishell) stopped.
(lldb) exit
Quitting LLDB will kill one or more processes. Do you really want to proceed: [Y/n] Y
minishell on dev_read [$!]
❯
ヒープ領域とスタック領域をごちゃ混ぜにして使ってしまっているのが理解できなくなっている原因っぽい。
echo hello
0: echo, SPACE
1: hello, END
echo hello
0: echo, SPACE
1: hello, END
echo hello world
0: echo, SPACE
1: hello, SPACE
2: world, END
echo "hello world"
0: echo, SPACE
1: "hello world", END
echo 'hello world'
0: echo, SPACE
1: 'hello world', END
シングルクォートとダブルクォートをreadの段階で外しちゃうと、$string
が展開出来なくなっちゃうから残さないといけないね
これ特に問題なくなってるはずなので、閉じます。