minishell破壊マニュアル - Wolframike/minishell GitHub Wiki

まえがき

  • 要件に明記されているケースも必ず試すこと
  • 要件を満たしており、クラッシュしないのなら、下記のテストで正しい挙動が確認できなかった場合でもディフェンス次第でOKとすること
  • ctrl+v + tabで\tを入力可能、チェックすること
  • leaksコマンドを頻繁に打つこと
  • グローバル変数がシグナル用に1つしか使用されていないことを以下のコマンドで確認すること
nm --defined-only minishell | grep -v " T " | grep -v " t "
  • 以下のコードを適切な位置に追加しfdの閉め忘れをチェックすること
int fd = dup2(1);
printf("%d", fd);
close(fd);

misc

\
$_
""
" "

echo

echo - aaa #- aaa
echo -nnnnnn aaa #aaa%
echo -nnnna aaa #-nnnna aaa
echo -n -n -n -n -n aaa #aaa%

exit

aaa
exit #127でexit
exit a b #numeric argument required, exitする
exit + #numeric argument required
exit - #numeric argument required
exit 1 a #too many arguments, exitしない
exit | exit #exitしない
exit -1 #有効
exit "      42     " #42でexit
exit <LONG_MAX + 1> #numeric argument required

Return value of a process

aaa
ls | echo $? #0

Signals

#ctrl+c
echo $? #1
./minishell
./minishell
#ctrl+c連打
top
#ctrl+\

Double/Single Quotes

l"s" #有効
"l"s #有効

env

export aaa
env #aaaは出力されない

export

export #ascii順で、declare -x key="value"もしくはdeclare -x keyの羅列が出力される
export $aaa $bbb $ccc
#declareが出力される
export a=" touch a b c d e "
$a
export a=" export b=c d=e" f=g
$a
export 1 #not a valid identifier

unset

unset PATH
env
unset PAT
env
unset PATH
ls #No such file or directory
unset TERM
clear #TERM environment variable not set

cd

#zsh/bash
mkdir dne
cd dne
rm -rf ../dne
#minishell起動
cd . #error retrieving current directory
cd .. #有効
#zsh/bash
mkdir noperm
chmod -x ../noperm
#minishell起動
cd . #error retrieving current directory
cd .. #有効

pwd

mkdir dne
cd dne
rm -rf ../dne
pwd #有効
mkdir dne
cd dne
chmod -x ../dne
pwd #有効
#cdの2ケースと同じ条件を作る
pwd #error retrieving current directory

Relative path

mkdir dir
./dir #is a directory

Environment path

#コマンドど同名の実行ファイルをカレントディレクトリに作成(lsなど)
export PATH=$PWD:$PATH
ls #作成した方のlsが実行される

Redirection

> a #aが作成される
echo > outfile aaa
cat outfile #aaa
echo aaa > outfile1 > outfile2 > outfile3
cat outfile1 #有効
cat outfile2 #有効
cat outfile3 #aaa
cat << "
cat << EOF" #シングルクオーテーションでも同様のチェック
cat <<
#ctrl+c

Pipes

echo aaa > outfile | cat -e #出力なし
cat outfile #aaa
ls | ls | aaa
echo $? #127
aaa | ls | ls
echo $? #0

Environment variables

export PS1="minishell$ "
bash #プロンプトが書き換わっている

あとがき

while [ 1 ]
do
kill -s SIGINT <pid>
done
⚠️ **GitHub.com Fallback** ⚠️