From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jim Blandy To: gdb-patches@sources.redhat.com Subject: RFA: compare strings carefully in gdbarch.sh Date: Wed, 06 Jun 2001 11:17:00 -0000 Message-id: <20010606181831.CDD365E9CB@zwingli.cygnus.com> X-SW-Source: 2001-06/msg00086.html 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 * 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"