This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

RFA: compare strings carefully in gdbarch.sh



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"


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]