This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
RFA: compare strings carefully in gdbarch.sh
- To: gdb-patches at sources dot redhat dot com
- Subject: RFA: compare strings carefully in gdbarch.sh
- From: Jim Blandy <jimb at zwingli dot cygnus dot com>
- Date: Wed, 6 Jun 2001 13:18:31 -0500 (EST)
When I run gdbarch.sh on my Red Hat 6.2 box, I get the following
messages:
zenia:gdb$ ./gdbarch.sh
gdbarch.log unchanged
gdbarch.h unchanged
./gdbarch.sh: [: -1: unary operator expected
./gdbarch.sh: [: -1: unary operator expected
./gdbarch.sh: [: -1: unary operator expected
./gdbarch.sh: [: -1: unary operator expected
./gdbarch.sh: [: -1: unary operator expected
./gdbarch.sh: [: -1: unary operator expected
./gdbarch.sh: [: -1: unary operator expected
./gdbarch.sh: [: -1: unary operator expected
./gdbarch.sh: [: -1: unary operator expected
./gdbarch.sh: [: -1: unary operator expected
./gdbarch.sh: [: -1: unary operator expected
./gdbarch.sh: [: -1: unary operator expected
./gdbarch.sh: [: -1: unary operator expected
./gdbarch.sh: [: -1: unary operator expected
./gdbarch.sh: [: -1: unary operator expected
./gdbarch.sh: [: -1: unary operator expected
./gdbarch.sh: [: -1: unary operator expected
./gdbarch.sh: [: -1: unary operator expected
This is due to the use of test expressions like [ ${foo} -a ${bar} ],
when ${foo} is -1. Check this out:
$ [ -1 ] && echo "hi"
hi
$ [ -1 -a -2 ] && echo "hi"
[: -1: unary operator expected
Isn't that amazing? If it's the only thing there, then `[' knows it's
not a unary operator, and apparently applies the "true if string not
null" interpretation to it. But if it's followed by something, then
it assumes it's an operator.
The script also uses a lot of [ "${foo}" != "" ] tests. These can
fail in similar ways, if ${foo} something like "-n".
The following patch fixes these problems, where I saw them.
2001-06-06 Jim Blandy <jimb@redhat.com>
* gdbarch.sh: Make sure that '[' doesn't interpret interesting
variable values as operators.
Index: gdb/gdbarch.sh
===================================================================
RCS file: /cvs/src/src/gdb/gdbarch.sh,v
retrieving revision 1.65
diff -c -r1.65 gdbarch.sh
*** gdb/gdbarch.sh 2001/06/06 17:47:28 1.65
--- gdb/gdbarch.sh 2001/06/06 18:15:02
***************
*** 85,91 ****
case "${invalid_p}" in
0 ) valid_p=1 ;;
"" )
! if [ "${predefault}" ]
then
#invalid_p="gdbarch->${function} == ${predefault}"
valid_p="gdbarch->${function} != ${predefault}"
--- 85,91 ----
case "${invalid_p}" in
0 ) valid_p=1 ;;
"" )
! if [ -n "${predefault}" ]
then
#invalid_p="gdbarch->${function} == ${predefault}"
valid_p="gdbarch->${function} != ${predefault}"
***************
*** 104,113 ****
# always a valid definition of MEMBER as this again
# ensures consistency.
! if [ "${postdefault}" != "" ]
then
fallbackdefault="${postdefault}"
! elif [ "${predefault}" != "" ]
then
fallbackdefault="${predefault}"
else
--- 104,113 ----
# always a valid definition of MEMBER as this again
# ensures consistency.
! if [ -n "${postdefault}" ]
then
fallbackdefault="${postdefault}"
! elif [ -n "${predefault}" ]
then
fallbackdefault="${predefault}"
else
***************
*** 120,126 ****
break
fi
done
! if [ "${class}" ]
then
true
else
--- 120,126 ----
break
fi
done
! if [ -n "${class}" ]
then
true
else
***************
*** 131,138 ****
fallback_default_p ()
{
! [ "${postdefault}" != "" -a "${invalid_p}" != "0" ] \
! || [ "${predefault}" != "" -a "${invalid_p}" = "0" ]
}
class_is_variable_p ()
--- 131,138 ----
fallback_default_p ()
{
! [ -n "${postdefault}" -a "x${invalid_p}" != "x0" ] \
! || [ -n "${predefault}" -a "x${invalid_p}" = "x0" ]
}
class_is_variable_p ()
***************
*** 549,555 ****
kill $$
exit 1
fi
! if [ "${invalid_p}" = "0" -a "${postdefault}" != "" ]
then
echo "Error: postdefault is useless when invalid_p=0" 1>&2
kill $$
--- 549,555 ----
kill $$
exit 1
fi
! if [ "x${invalid_p}" = "x0" -a -n "${postdefault}" ]
then
echo "Error: postdefault is useless when invalid_p=0" 1>&2
kill $$
***************
*** 660,666 ****
printf "/* The following are initialized by the target dependent code. */\n"
function_list | while do_read
do
! if [ "${comment}" ]
then
echo "${comment}" | sed \
-e '2 s,#,/*,' \
--- 660,666 ----
printf "/* The following are initialized by the target dependent code. */\n"
function_list | while do_read
do
! if [ -n "${comment}" ]
then
echo "${comment}" | sed \
-e '2 s,#,/*,' \
***************
*** 725,731 ****
printf "\n"
printf "/* Default (function) for non- multi-arch platforms. */\n"
printf "#if (!GDB_MULTI_ARCH) && !defined (${macro})\n"
! if [ "${fallbackdefault}" = "0" ]
then
printf "#define ${macro}(${actual}) (internal_error (__FILE__, __LINE__, \"${macro}\"), 0)\n"
else
--- 725,731 ----
printf "\n"
printf "/* Default (function) for non- multi-arch platforms. */\n"
printf "#if (!GDB_MULTI_ARCH) && !defined (${macro})\n"
! if [ "x${fallbackdefault}" = "x0" ]
then
printf "#define ${macro}(${actual}) (internal_error (__FILE__, __LINE__, \"${macro}\"), 0)\n"
else
***************
*** 736,742 ****
printf "#endif\n"
fi
printf "\n"
! if [ "${formal}" = "void" ] && class_is_multiarch_p
then
printf "typedef ${returntype} (gdbarch_${function}_ftype) (struct gdbarch *gdbarch);\n"
elif class_is_multiarch_p
--- 736,742 ----
printf "#endif\n"
fi
printf "\n"
! if [ "x${formal}" = "xvoid" ] && class_is_multiarch_p
then
printf "typedef ${returntype} (gdbarch_${function}_ftype) (struct gdbarch *gdbarch);\n"
elif class_is_multiarch_p
***************
*** 745,751 ****
else
printf "typedef ${returntype} (gdbarch_${function}_ftype) (${formal});\n"
fi
! if [ "${formal}" = "void" ]
then
printf "extern ${returntype} gdbarch_${function} (struct gdbarch *gdbarch);\n"
else
--- 745,751 ----
else
printf "typedef ${returntype} (gdbarch_${function}_ftype) (${formal});\n"
fi
! if [ "x${formal}" = "xvoid" ]
then
printf "extern ${returntype} gdbarch_${function} (struct gdbarch *gdbarch);\n"
else
***************
*** 756,765 ****
else
printf "#if GDB_MULTI_ARCH\n"
printf "#if (GDB_MULTI_ARCH > GDB_MULTI_ARCH_PARTIAL) || !defined (${macro})\n"
! if [ "${actual}" = "" ]
then
printf "#define ${macro}() (gdbarch_${function} (current_gdbarch))\n"
! elif [ "${actual}" = "-" ]
then
printf "#define ${macro} (gdbarch_${function} (current_gdbarch))\n"
else
--- 756,765 ----
else
printf "#if GDB_MULTI_ARCH\n"
printf "#if (GDB_MULTI_ARCH > GDB_MULTI_ARCH_PARTIAL) || !defined (${macro})\n"
! if [ "x${actual}" = "x" ]
then
printf "#define ${macro}() (gdbarch_${function} (current_gdbarch))\n"
! elif [ "x${actual}" = "x-" ]
then
printf "#define ${macro} (gdbarch_${function} (current_gdbarch))\n"
else
***************
*** 1295,1301 ****
do
if class_is_function_p || class_is_variable_p
then
! if [ "${predefault}" != "" -a "${predefault}" != "0" ]
then
printf " gdbarch->${function} = ${predefault};\n"
fi
--- 1295,1301 ----
do
if class_is_function_p || class_is_variable_p
then
! if [ -n "${predefault}" -a "x${predefault}" != "x0" ]
then
printf " gdbarch->${function} = ${predefault};\n"
fi
***************
*** 1352,1383 ****
do
if class_is_function_p || class_is_variable_p
then
! if [ "${invalid_p}" = "0" ]
then
printf " /* Skip verify of ${function}, invalid_p == 0 */\n"
elif class_is_predicate_p
then
printf " /* Skip verify of ${function}, has predicate */\n"
# FIXME: See do_read for potential simplification
! elif [ "${invalid_p}" -a "${postdefault}" ]
then
printf " if (${invalid_p})\n"
printf " gdbarch->${function} = ${postdefault};\n"
! elif [ "${predefault}" -a "${postdefault}" ]
then
printf " if (gdbarch->${function} == ${predefault})\n"
printf " gdbarch->${function} = ${postdefault};\n"
! elif [ "${postdefault}" ]
then
printf " if (gdbarch->${function} == 0)\n"
printf " gdbarch->${function} = ${postdefault};\n"
! elif [ "${invalid_p}" ]
then
printf " if ((GDB_MULTI_ARCH >= ${level})\n"
printf " && (${invalid_p}))\n"
printf " internal_error (__FILE__, __LINE__,\n"
printf " \"gdbarch: verify_gdbarch: ${function} invalid\");\n"
! elif [ "${predefault}" ]
then
printf " if ((GDB_MULTI_ARCH >= ${level})\n"
printf " && (gdbarch->${function} == ${predefault}))\n"
--- 1352,1383 ----
do
if class_is_function_p || class_is_variable_p
then
! if [ "x${invalid_p}" = "x0" ]
then
printf " /* Skip verify of ${function}, invalid_p == 0 */\n"
elif class_is_predicate_p
then
printf " /* Skip verify of ${function}, has predicate */\n"
# FIXME: See do_read for potential simplification
! elif [ -n "${invalid_p}" -a -n "${postdefault}" ]
then
printf " if (${invalid_p})\n"
printf " gdbarch->${function} = ${postdefault};\n"
! elif [ -n "${predefault}" -a -n "${postdefault}" ]
then
printf " if (gdbarch->${function} == ${predefault})\n"
printf " gdbarch->${function} = ${postdefault};\n"
! elif [ -n "${postdefault}" ]
then
printf " if (gdbarch->${function} == 0)\n"
printf " gdbarch->${function} = ${postdefault};\n"
! elif [ -n "${invalid_p}" ]
then
printf " if ((GDB_MULTI_ARCH >= ${level})\n"
printf " && (${invalid_p}))\n"
printf " internal_error (__FILE__, __LINE__,\n"
printf " \"gdbarch: verify_gdbarch: ${function} invalid\");\n"
! elif [ -n "${predefault}" ]
then
printf " if ((GDB_MULTI_ARCH >= ${level})\n"
printf " && (gdbarch->${function} == ${predefault}))\n"
***************
*** 1413,1419 ****
do
# multiarch functions don't have macros.
class_is_multiarch_p && continue
! if [ "${returntype}" = "void" ]
then
printf "#if defined (${macro}) && GDB_MULTI_ARCH\n"
printf " /* Macro might contain \`[{}]' when not multi-arch */\n"
--- 1413,1419 ----
do
# multiarch functions don't have macros.
class_is_multiarch_p && continue
! if [ "x${returntype}" = "xvoid" ]
then
printf "#if defined (${macro}) && GDB_MULTI_ARCH\n"
printf " /* Macro might contain \`[{}]' when not multi-arch */\n"
***************
*** 1444,1456 ****
continue
fi
printf "#ifdef ${macro}\n"
! if [ "${print_p}" = "()" ]
then
printf " gdbarch_dump_${function} (current_gdbarch);\n"
! elif [ "${print_p}" = "0" ]
then
printf " /* skip print of ${macro}, print_p == 0. */\n"
! elif [ "${print_p}" ]
then
printf " if (${print_p})\n"
printf " fprintf_unfiltered (file,\n"
--- 1444,1456 ----
continue
fi
printf "#ifdef ${macro}\n"
! if [ "x${print_p}" = "x()" ]
then
printf " gdbarch_dump_${function} (current_gdbarch);\n"
! elif [ "x${print_p}" = "x0" ]
then
printf " /* skip print of ${macro}, print_p == 0. */\n"
! elif [ -n "${print_p}" ]
then
printf " if (${print_p})\n"
printf " fprintf_unfiltered (file,\n"
***************
*** 1497,1503 ****
printf "int\n"
printf "gdbarch_${function}_p (struct gdbarch *gdbarch)\n"
printf "{\n"
! if [ "${valid_p}" ]
then
printf " return ${valid_p};\n"
else
--- 1497,1503 ----
printf "int\n"
printf "gdbarch_${function}_p (struct gdbarch *gdbarch)\n"
printf "{\n"
! if [ -n "${valid_p}" ]
then
printf " return ${valid_p};\n"
else
***************
*** 1509,1515 ****
then
printf "\n"
printf "${returntype}\n"
! if [ "${formal}" = "void" ]
then
printf "gdbarch_${function} (struct gdbarch *gdbarch)\n"
else
--- 1509,1515 ----
then
printf "\n"
printf "${returntype}\n"
! if [ "x${formal}" = "xvoid" ]
then
printf "gdbarch_${function} (struct gdbarch *gdbarch)\n"
else
***************
*** 1521,1527 ****
printf " \"gdbarch: gdbarch_${function} invalid\");\n"
printf " if (gdbarch_debug >= 2)\n"
printf " fprintf_unfiltered (gdb_stdlog, \"gdbarch_${function} called\\\\n\");\n"
! if [ "${actual}" = "-" -o "${actual}" = "" ]
then
if class_is_multiarch_p
then
--- 1521,1527 ----
printf " \"gdbarch: gdbarch_${function} invalid\");\n"
printf " if (gdbarch_debug >= 2)\n"
printf " fprintf_unfiltered (gdb_stdlog, \"gdbarch_${function} called\\\\n\");\n"
! if [ "x${actual}" = "x-" -o "x${actual}" = "x" ]
then
if class_is_multiarch_p
then
***************
*** 1537,1543 ****
params="${actual}"
fi
fi
! if [ "${returntype}" = "void" ]
then
printf " gdbarch->${function} (${params});\n"
else
--- 1537,1543 ----
params="${actual}"
fi
fi
! if [ "x${returntype}" = "xvoid" ]
then
printf " gdbarch->${function} (${params});\n"
else
***************
*** 1557,1571 ****
printf "${returntype}\n"
printf "gdbarch_${function} (struct gdbarch *gdbarch)\n"
printf "{\n"
! if [ "${invalid_p}" = "0" ]
then
printf " /* Skip verify of ${function}, invalid_p == 0 */\n"
! elif [ "${invalid_p}" ]
then
printf " if (${invalid_p})\n"
printf " internal_error (__FILE__, __LINE__,\n"
printf " \"gdbarch: gdbarch_${function} invalid\");\n"
! elif [ "${predefault}" ]
then
printf " if (gdbarch->${function} == ${predefault})\n"
printf " internal_error (__FILE__, __LINE__,\n"
--- 1557,1571 ----
printf "${returntype}\n"
printf "gdbarch_${function} (struct gdbarch *gdbarch)\n"
printf "{\n"
! if [ "x${invalid_p}" = "x0" ]
then
printf " /* Skip verify of ${function}, invalid_p == 0 */\n"
! elif [ -n "${invalid_p}" ]
then
printf " if (${invalid_p})\n"
printf " internal_error (__FILE__, __LINE__,\n"
printf " \"gdbarch: gdbarch_${function} invalid\");\n"
! elif [ -n "${predefault}" ]
then
printf " if (gdbarch->${function} == ${predefault})\n"
printf " internal_error (__FILE__, __LINE__,\n"