options-syntax.test revision 39bac055674d23770b9a724221b728e443196ea7
1d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#!/bin/sh
2d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#
3d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# Check strace options syntax.
4d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#
5d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# Copyright (c) 2016 Dmitry V. Levin <ldv@altlinux.org>
639bac055674d23770b9a724221b728e443196ea7Elliott Hughes# Copyright (c) 2016-2017 The strace developers.
7d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# All rights reserved.
8d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#
9d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# Redistribution and use in source and binary forms, with or without
10d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# modification, are permitted provided that the following conditions
11d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# are met:
12d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# 1. Redistributions of source code must retain the above copyright
13d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#    notice, this list of conditions and the following disclaimer.
14d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# 2. Redistributions in binary form must reproduce the above copyright
15d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#    notice, this list of conditions and the following disclaimer in the
16d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#    documentation and/or other materials provided with the distribution.
17d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# 3. The name of the author may not be used to endorse or promote products
18d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#    derived from this software without specific prior written permission.
19d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes#
20d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
23d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
24d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
25d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
29d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
31d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes. "${srcdir=.}/init.sh"
32d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
33d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughescheck_exit_status_and_stderr()
34d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
35d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	$STRACE "$@" 2> "$LOG" &&
36d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		dump_log_and_fail_with \
37d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			"strace $* failed to handle the error properly"
38d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	match_diff "$LOG" "$EXP" ||
39d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		dump_log_and_fail_with \
40d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes			"strace $* failed to print expected diagnostics"
41d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
42d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
4339bac055674d23770b9a724221b728e443196ea7Elliott Hughescheck_exit_status_and_stderr_using_grep()
4439bac055674d23770b9a724221b728e443196ea7Elliott Hughes{
4539bac055674d23770b9a724221b728e443196ea7Elliott Hughes	$STRACE "$@" 2> "$LOG" &&
4639bac055674d23770b9a724221b728e443196ea7Elliott Hughes		dump_log_and_fail_with \
4739bac055674d23770b9a724221b728e443196ea7Elliott Hughes			"strace $* failed to handle the error properly"
4839bac055674d23770b9a724221b728e443196ea7Elliott Hughes	match_grep "$LOG" "$EXP" ||
4939bac055674d23770b9a724221b728e443196ea7Elliott Hughes		dump_log_and_fail_with \
5039bac055674d23770b9a724221b728e443196ea7Elliott Hughes			"strace $* failed to print expected diagnostics"
5139bac055674d23770b9a724221b728e443196ea7Elliott Hughes}
5239bac055674d23770b9a724221b728e443196ea7Elliott Hughes
53d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesstrace_exp="${STRACE##* }"
54d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
55d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughescheck_e()
56d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
57d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	local pattern="$1"; shift
58d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	cat > "$EXP" << __EOF__
59d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes$strace_exp: $pattern
60d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes__EOF__
61d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	check_exit_status_and_stderr "$@"
62d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
63d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
6439bac055674d23770b9a724221b728e443196ea7Elliott Hughescheck_e_using_grep()
6539bac055674d23770b9a724221b728e443196ea7Elliott Hughes{
6639bac055674d23770b9a724221b728e443196ea7Elliott Hughes	local pattern="$1"; shift
6739bac055674d23770b9a724221b728e443196ea7Elliott Hughes	cat > "$EXP" << __EOF__
6839bac055674d23770b9a724221b728e443196ea7Elliott Hughes$strace_exp: $pattern
6939bac055674d23770b9a724221b728e443196ea7Elliott Hughes__EOF__
7039bac055674d23770b9a724221b728e443196ea7Elliott Hughes	check_exit_status_and_stderr_using_grep "$@"
7139bac055674d23770b9a724221b728e443196ea7Elliott Hughes}
7239bac055674d23770b9a724221b728e443196ea7Elliott Hughes
73d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughescheck_h()
74d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes{
75d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	local pattern="$1"; shift
76d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	cat > "$EXP" << __EOF__
77d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes$strace_exp: $pattern
78d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott HughesTry '$strace_exp -h' for more information.
79d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes__EOF__
80d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	check_exit_status_and_stderr "$@"
81d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes}
82d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
83d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughescheck_e "Invalid process id: '0'" -p 0
84d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughescheck_e "Invalid process id: '-42'" -p -42
85d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughescheck_e "Invalid process id: '$$.'" -p $$.
86d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughescheck_e "Invalid process id: 'a'" -p 1,a
87d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughescheck_e "Syscall 'chdir' for -b isn't supported" -b chdir
88d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughescheck_e "Syscall 'chdir' for -b isn't supported" -b execve -b chdir
89d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
90d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughescheck_e "invalid system call '-1'" -e-1
91d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughescheck_e "invalid system call '-2'" -e -2
92d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughescheck_e "invalid system call '-3'" -etrace=-3
93d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughescheck_e "invalid system call '-4'" -e trace=-4
94d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughescheck_e "invalid system call '-5'" -e trace=1,-5
9539bac055674d23770b9a724221b728e443196ea7Elliott Hughescheck_e "invalid system call '/non_syscall'" -e trace=/non_syscall
96d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughescheck_e "invalid system call '2147483647'" -e 2147483647
97d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughescheck_e "invalid system call '2147483648'" -e 2147483648
98d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughescheck_e "invalid system call '4294967295'" -e 4294967295
99d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughescheck_e "invalid system call '4294967296'" -e 4294967296
100d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
101d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughescheck_e "invalid descriptor '-1'" -eread=-1
102d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughescheck_e "invalid descriptor '-42'" -ewrite=-42
103d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughescheck_e "invalid descriptor '2147483648'" -eread=2147483648
104d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughescheck_e "invalid descriptor '4294967296'" -ewrite=4294967296
105d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughescheck_e "invalid descriptor 'foo'" -eread=foo
106d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughescheck_e "invalid descriptor ''" -ewrite=
107d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughescheck_e "invalid descriptor ','" -eread=,
108d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughescheck_e "invalid descriptor '!'" -ewrite='!'
109d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughescheck_e "invalid descriptor '!'" -eread='0,!'
110d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughescheck_e "invalid descriptor '!,'" -ewrite='!,'
111d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
11239bac055674d23770b9a724221b728e443196ea7Elliott Hughescheck_e_using_grep 'regcomp: \+id: [[:alpha:]].+' -e trace='/+id'
11339bac055674d23770b9a724221b728e443196ea7Elliott Hughescheck_e_using_grep 'regcomp: \*id: [[:alpha:]].+' -e trace='/*id'
11439bac055674d23770b9a724221b728e443196ea7Elliott Hughescheck_e_using_grep 'regcomp: \{id: [[:alpha:]].+' -e trace='/{id'
11539bac055674d23770b9a724221b728e443196ea7Elliott Hughescheck_e_using_grep 'regcomp: \(id: [[:alpha:]].+' -e trace='/(id'
11639bac055674d23770b9a724221b728e443196ea7Elliott Hughescheck_e_using_grep 'regcomp: \[id: [[:alpha:]].+' -e trace='/[id'
11739bac055674d23770b9a724221b728e443196ea7Elliott Hughes
118d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughescheck_h 'must have PROG [ARGS] or -p PID'
119d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughescheck_h 'PROG [ARGS] must be specified with -D' -D -p $$
120d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughescheck_h '-c and -C are mutually exclusive' -c -C true
121d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughescheck_h '-c and -C are mutually exclusive' -C -c true
122d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughescheck_h '(-c or -C) and -ff are mutually exclusive' -c -ff true
123d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughescheck_h '(-c or -C) and -ff are mutually exclusive' -C -ff true
124d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughescheck_h '-w must be given with (-c or -C)' -w true
125d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughescheck_h 'piping the output and -ff are mutually exclusive' -o '|' -ff true
126d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughescheck_h 'piping the output and -ff are mutually exclusive' -o '!' -ff true
127d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughescheck_h "invalid -a argument: '-42'" -a -42
128d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughescheck_h "invalid -O argument: '-42'" -O -42
129d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughescheck_h "invalid -s argument: '-42'" -s -42
130d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughescheck_h "invalid -I argument: '5'" -I 5
131d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
132d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesif [ -n "${UID-}" ]; then
133d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	if [ "${UID-}" = 0 ]; then
134d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		umsg="Cannot find user ':nosuchuser:'"
135d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	else
136d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		umsg='You must be root to use the -u option'
137d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	fi
138d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
139d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	check_e "$umsg" -u :nosuchuser: true
140d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
141d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	for c in i r t T y; do
142d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		check_e "-$c has no effect with -c
143d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes$strace_exp: $umsg" -u :nosuchuser: -c -$c true
144d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	done
145d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		check_e "-i has no effect with -c
146d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes$strace_exp: -r has no effect with -c
147d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes$strace_exp: -t has no effect with -c
148d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes$strace_exp: -T has no effect with -c
149d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes$strace_exp: -y has no effect with -c
150d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes$strace_exp: $umsg" -u :nosuchuser: -cirtTy true
151d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
152d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	check_e "-tt has no effect with -r
153d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes$strace_exp: $umsg" -u :nosuchuser: -r -tt true
154d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesfi
155d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
156d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesargs='-p 2147483647'
157d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes$STRACE $args 2> "$LOG" &&
158d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	dump_log_and_fail_with \
159d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		"strace $args failed to handle the error properly"
160d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
161d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesfor cmd in PTRACE_SEIZE PTRACE_ATTACH; do
162d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	cat > "$EXP" << __EOF__
163d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes$strace_exp: attach: ptrace($cmd, 2147483647): No such process
164d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes__EOF__
165d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	diff -- "$EXP" "$LOG" ||
166d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		continue
167d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	args=
168d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	break
169d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughesdone
170d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes
171d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes[ -z "$args" ] ||
172d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes	dump_log_and_fail_with \
173d35df493b4e7684c50d2d2fa032ee3a7ac228009Elliott Hughes		"strace $args failed to print expected diagnostics"
174