Fix for PR gdb/17235: possible bug extracting systemtap probe operand
authorSergio Durigan Junior <sergiodj@redhat.com>
Fri, 5 Sep 2014 19:21:44 +0000 (15:21 -0400)
committerSergio Durigan Junior <sergiodj@redhat.com>
Fri, 5 Sep 2014 19:21:44 +0000 (15:21 -0400)
commit474ca4f6871d4addb7ce6a177245bce79c89550e
tree4b2dfcbe59886833ae57af8e009c0180f7c360d4
parent514104634d0efd8955f7fd45cd509963e28212f6
Fix for PR gdb/17235: possible bug extracting systemtap probe operand

This patch is a fix to PR gdb/17235.  The bug is about an unused
variable that got declared and set during one of the parsing phases of
an SDT probe's argument.  I took the opportunity to rewrite some of the
code to improve the parsing.  The bug was actually a thinko, because
what I wanted to do in the code was to discard the number on the string
being parsed.

During this portion, the code identifies that it is dealing with an
expression that begins with a sign ('+', '-' or '~').  This means that
the expression could be:

- a numeric literal (e.g., '+5')
- a register displacement (e.g., '-4(%rsp)')
- a subexpression (e.g., '-(2*3)')

So, after saving the sign and moving forward 1 char, now the code needs
to know if there is a digit followed by a register displacement prefix
operand (e.g., '(' on x86_64).  If yes, then it is a register
operation.  If not, then it will be handled recursively, and the code
will later apply the requested operation on the result (either a '+', a
'-' or a '~').

With the bug, the code was correctly discarding the digit (though using
strtol unnecessarily), but it wasn't properly dealing with
subexpressions when the register indirection prefix was '(', like on
x86_64.  This patch also fixes this bug, and includes a testcase.  It
passes on x86_64 Fedora 20.
gdb/ChangeLog
gdb/stap-probe.c
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.arch/amd64-stap-wrong-subexp.S [new file with mode: 0644]
gdb/testsuite/gdb.arch/amd64-stap-wrong-subexp.exp [new file with mode: 0644]