* [RFC] Fix build failure in stap-probe.c.
@ 2012-05-02 8:17 Doug Evans
2012-05-02 18:56 ` Sergio Durigan Junior
0 siblings, 1 reply; 5+ messages in thread
From: Doug Evans @ 2012-05-02 8:17 UTC (permalink / raw)
To: sergiodj, tromey, jan.kratochvil; +Cc: gdb-patches
Hi.
I'm getting build failures, gcc is complaining that "opcode" and
"lookahead_opcode" "may be used uninitialized".
cc1: warnings being treated as errors
../../src/gdb/stap-probe.c: In function 'stap_parse_argument_1':
../../src/gdb/stap-probe.c:1558: error: 'lookahead_opcode' may be used uninitialized in this function
../../src/gdb/stap-probe.c:813: note: 'lookahead_opcode' was declared here
../../src/gdb/stap-probe.c:1558: error: 'opcode' may be used uninitialized in this function
../../src/gdb/stap-probe.c:778: note: 'opcode' was declared here
make: *** [stap-probe.o] Error 1
This patch is just RFC.
IIUC the code already watches for valid operators before
calling stap_get_opcode, so stap_get_opcode should "never" return zero.
So I'm wondering if maybe step_get_opcode should be changed
to always succeed and always set the opcode.
Can one of you look at this?
2012-05-02 Doug Evans <dje@google.com>
* stap-probe.c (stap_parse_argument_1): Fix "may be used uninitialized"
build failures.
Index: stap-probe.c
===================================================================
RCS file: /cvs/src/src/gdb/stap-probe.c,v
retrieving revision 1.1
diff -u -p -r1.1 stap-probe.c
--- stap-probe.c 27 Apr 2012 20:47:56 -0000 1.1
+++ stap-probe.c 2 May 2012 08:02:24 -0000
@@ -775,7 +775,8 @@ stap_parse_argument_1 (struct stap_parse
while (p->arg && *p->arg && *p->arg != ')' && !isspace (*p->arg))
{
const char *tmp_exp_buf;
- enum exp_opcode opcode;
+ /* Initialize to pacify gcc. */
+ enum exp_opcode opcode = OP_LONG;
enum stap_operand_prec cur_prec;
if (!stap_is_operator (*p->arg))
@@ -810,7 +811,8 @@ stap_parse_argument_1 (struct stap_parse
right-side, but using the current right-side as a left-side. */
while (*p->arg && stap_is_operator (*p->arg))
{
- enum exp_opcode lookahead_opcode;
+ /* Initialize to pacify gcc. */
+ enum exp_opcode lookahead_opcode = OP_LONG;
enum stap_operand_prec lookahead_prec;
/* Saving the current expression buffer position. The explanation
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [RFC] Fix build failure in stap-probe.c.
2012-05-02 8:17 [RFC] Fix build failure in stap-probe.c Doug Evans
@ 2012-05-02 18:56 ` Sergio Durigan Junior
2012-05-03 17:53 ` Doug Evans
0 siblings, 1 reply; 5+ messages in thread
From: Sergio Durigan Junior @ 2012-05-02 18:56 UTC (permalink / raw)
To: Doug Evans; +Cc: tromey, jan.kratochvil, gdb-patches
On Wednesday, May 02 2012, Doug Evans wrote:
> Hi.
>
> I'm getting build failures, gcc is complaining that "opcode" and
> "lookahead_opcode" "may be used uninitialized".
Hi Doug,
I'm not seeing this error when I compile (even with -O2), but I believe
you :-).
> cc1: warnings being treated as errors
> ../../src/gdb/stap-probe.c: In function 'stap_parse_argument_1':
> ../../src/gdb/stap-probe.c:1558: error: 'lookahead_opcode' may be used uninitialized in this function
> ../../src/gdb/stap-probe.c:813: note: 'lookahead_opcode' was declared here
> ../../src/gdb/stap-probe.c:1558: error: 'opcode' may be used uninitialized in this function
> ../../src/gdb/stap-probe.c:778: note: 'opcode' was declared here
> make: *** [stap-probe.o] Error 1
>
> This patch is just RFC.
> IIUC the code already watches for valid operators before
> calling stap_get_opcode, so stap_get_opcode should "never" return zero.
> So I'm wondering if maybe step_get_opcode should be changed
> to always succeed and always set the opcode.
You're right. Does this patch work for you?
2012-05-02 Sergio Durigan Junior <sergiodj@redhat.com>
* stap-probe.c (stap_is_operator): Change declaration.
(stap_get_opcode): Change return value.
(stap_parse_argument_1): Update calls to `stap_get_opcode' and
`stap_parse_argument_1'.
---
gdb/stap-probe.c | 101 ++++++++++++++++++++++++++++++++---------------------
1 files changed, 61 insertions(+), 40 deletions(-)
diff --git a/gdb/stap-probe.c b/gdb/stap-probe.c
index d1a38da..273ae07 100644
--- a/gdb/stap-probe.c
+++ b/gdb/stap-probe.c
@@ -154,7 +154,7 @@ static void stap_parse_argument_conditionally (struct stap_parse_info *p);
/* Returns 1 if *S is an operator, zero otherwise. */
-static int stap_is_operator (char op);
+static int stap_is_operator (const char *op);
static void
show_stapexpressiondebug (struct ui_file *file, int from_tty,
@@ -209,111 +209,107 @@ stap_get_operator_prec (enum exp_opcode op)
/* Given S, read the operator in it and fills the OP pointer with its code.
Return 1 on success, zero if the operator was not recognized. */
-static int
-stap_get_opcode (const char **s, enum exp_opcode *op)
+static enum exp_opcode
+stap_get_opcode (const char **s)
{
const char c = **s;
- int ret = 1;
+ enum exp_opcode op;
*s += 1;
switch (c)
{
case '*':
- *op = BINOP_MUL;
+ op = BINOP_MUL;
break;
case '/':
- *op = BINOP_DIV;
+ op = BINOP_DIV;
break;
case '%':
- *op = BINOP_REM;
+ op = BINOP_REM;
break;
case '<':
- *op = BINOP_LESS;
+ op = BINOP_LESS;
if (**s == '<')
{
*s += 1;
- *op = BINOP_LSH;
+ op = BINOP_LSH;
}
else if (**s == '=')
{
*s += 1;
- *op = BINOP_LEQ;
+ op = BINOP_LEQ;
}
else if (**s == '>')
{
*s += 1;
- *op = BINOP_NOTEQUAL;
+ op = BINOP_NOTEQUAL;
}
break;
case '>':
- *op = BINOP_GTR;
+ op = BINOP_GTR;
if (**s == '>')
{
*s += 1;
- *op = BINOP_RSH;
+ op = BINOP_RSH;
}
else if (**s == '=')
{
*s += 1;
- *op = BINOP_GEQ;
+ op = BINOP_GEQ;
}
break;
case '|':
- *op = BINOP_BITWISE_IOR;
+ op = BINOP_BITWISE_IOR;
if (**s == '|')
{
*s += 1;
- *op = BINOP_LOGICAL_OR;
+ op = BINOP_LOGICAL_OR;
}
break;
case '&':
- *op = BINOP_BITWISE_AND;
+ op = BINOP_BITWISE_AND;
if (**s == '&')
{
*s += 1;
- *op = BINOP_LOGICAL_AND;
+ op = BINOP_LOGICAL_AND;
}
break;
case '^':
- *op = BINOP_BITWISE_XOR;
+ op = BINOP_BITWISE_XOR;
break;
case '!':
- *op = UNOP_LOGICAL_NOT;
+ op = UNOP_LOGICAL_NOT;
break;
case '+':
- *op = BINOP_ADD;
+ op = BINOP_ADD;
break;
case '-':
- *op = BINOP_SUB;
+ op = BINOP_SUB;
break;
case '=':
- if (**s != '=')
- {
- ret = 0;
- break;
- }
- *op = BINOP_EQUAL;
+ gdb_assert (**s == '=');
+ op = BINOP_EQUAL;
break;
default:
- /* We didn't find any operator. */
- *s -= 1;
- return 0;
+ internal_error (__FILE__, __LINE__,
+ _("Invalid opcode in expression `%s' for SystemTap"
+ "probe"), *s);
}
- return ret;
+ return op;
}
/* Given the bitness of the argument, represented by B, return the
@@ -773,7 +769,7 @@ stap_parse_argument_1 (struct stap_parse_info *p, int has_lhs,
enum exp_opcode opcode;
enum stap_operand_prec cur_prec;
- if (!stap_is_operator (*p->arg))
+ if (!stap_is_operator (p->arg))
error (_("Invalid operator `%c' on expression `%s'."), *p->arg,
p->saved_arg);
@@ -782,7 +778,7 @@ stap_parse_argument_1 (struct stap_parse_info *p, int has_lhs,
operator. If this operator's precedence is lower than PREC, we
should return and not advance the expression buffer pointer. */
tmp_exp_buf = p->arg;
- stap_get_opcode (&tmp_exp_buf, &opcode);
+ opcode = stap_get_opcode (&tmp_exp_buf);
cur_prec = stap_get_operator_prec (opcode);
if (cur_prec < prec)
@@ -803,7 +799,7 @@ stap_parse_argument_1 (struct stap_parse_info *p, int has_lhs,
/* While we still have operators, try to parse another
right-side, but using the current right-side as a left-side. */
- while (*p->arg && stap_is_operator (*p->arg))
+ while (*p->arg && stap_is_operator (p->arg))
{
enum exp_opcode lookahead_opcode;
enum stap_operand_prec lookahead_prec;
@@ -811,7 +807,7 @@ stap_parse_argument_1 (struct stap_parse_info *p, int has_lhs,
/* Saving the current expression buffer position. The explanation
is the same as above. */
tmp_exp_buf = p->arg;
- stap_get_opcode (&tmp_exp_buf, &lookahead_opcode);
+ lookahead_opcode = stap_get_opcode (&tmp_exp_buf);
lookahead_prec = stap_get_operator_prec (lookahead_opcode);
if (lookahead_prec <= prec)
@@ -1013,11 +1009,36 @@ stap_get_probe_argument_count (struct probe *probe_generic,
otherwise. */
static int
-stap_is_operator (char op)
+stap_is_operator (const char *op)
{
- return (op == '+' || op == '-' || op == '*' || op == '/'
- || op == '>' || op == '<' || op == '!' || op == '^'
- || op == '|' || op == '&' || op == '%' || op == '=');
+ int ret = 1;
+
+ switch (*op)
+ {
+ case '*':
+ case '/':
+ case '%':
+ case '^':
+ case '!':
+ case '+':
+ case '-':
+ case '<':
+ case '>':
+ case '|':
+ case '&':
+ break;
+
+ case '=':
+ if (op[1] != '=')
+ ret = 0;
+ break;
+
+ default:
+ /* We didn't find any operator. */
+ ret = 0;
+ }
+
+ return ret;
}
static struct stap_probe_arg *
--
1.7.7.6
--
Sergio
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [RFC] Fix build failure in stap-probe.c.
2012-05-02 18:56 ` Sergio Durigan Junior
@ 2012-05-03 17:53 ` Doug Evans
2012-05-03 20:05 ` Sergio Durigan Junior
0 siblings, 1 reply; 5+ messages in thread
From: Doug Evans @ 2012-05-03 17:53 UTC (permalink / raw)
To: Sergio Durigan Junior; +Cc: tromey, jan.kratochvil, gdb-patches
On Wed, May 2, 2012 at 11:56 AM, Sergio Durigan Junior
<sergiodj@redhat.com> wrote:
> On Wednesday, May 02 2012, Doug Evans wrote:
>
>> Hi.
>>
>> I'm getting build failures, gcc is complaining that "opcode" and
>> "lookahead_opcode" "may be used uninitialized".
>
> Hi Doug,
>
> I'm not seeing this error when I compile (even with -O2), but I believe
> you :-).
>
>> cc1: warnings being treated as errors
>> ../../src/gdb/stap-probe.c: In function 'stap_parse_argument_1':
>> ../../src/gdb/stap-probe.c:1558: error: 'lookahead_opcode' may be used uninitialized in this function
>> ../../src/gdb/stap-probe.c:813: note: 'lookahead_opcode' was declared here
>> ../../src/gdb/stap-probe.c:1558: error: 'opcode' may be used uninitialized in this function
>> ../../src/gdb/stap-probe.c:778: note: 'opcode' was declared here
>> make: *** [stap-probe.o] Error 1
>>
>> This patch is just RFC.
>> IIUC the code already watches for valid operators before
>> calling stap_get_opcode, so stap_get_opcode should "never" return zero.
>> So I'm wondering if maybe step_get_opcode should be changed
>> to always succeed and always set the opcode.
>
> You're right. Does this patch work for you?
>
> 2012-05-02 Sergio Durigan Junior <sergiodj@redhat.com>
>
> * stap-probe.c (stap_is_operator): Change declaration.
> (stap_get_opcode): Change return value.
> (stap_parse_argument_1): Update calls to `stap_get_opcode' and
> `stap_parse_argument_1'.
Works great, thanks!
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [RFC] Fix build failure in stap-probe.c.
2012-05-03 17:53 ` Doug Evans
@ 2012-05-03 20:05 ` Sergio Durigan Junior
2012-05-03 20:27 ` Doug Evans
0 siblings, 1 reply; 5+ messages in thread
From: Sergio Durigan Junior @ 2012-05-03 20:05 UTC (permalink / raw)
To: Doug Evans; +Cc: tromey, jan.kratochvil, gdb-patches
On Thursday, May 03 2012, Doug Evans wrote:
> On Wed, May 2, 2012 at 11:56 AM, Sergio Durigan Junior
> <sergiodj@redhat.com> wrote:
>> You're right. Does this patch work for you?
>>
>> 2012-05-02 Sergio Durigan Junior <sergiodj@redhat.com>
>>
>> * stap-probe.c (stap_is_operator): Change declaration.
>> (stap_get_opcode): Change return value.
>> (stap_parse_argument_1): Update calls to `stap_get_opcode' and
>> `stap_parse_argument_1'.
>
> Works great, thanks!
Thanks, checked in:
http://sourceware.org/ml/gdb-cvs/2012-05/msg00024.html
--
Sergio
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [RFC] Fix build failure in stap-probe.c.
2012-05-03 20:05 ` Sergio Durigan Junior
@ 2012-05-03 20:27 ` Doug Evans
0 siblings, 0 replies; 5+ messages in thread
From: Doug Evans @ 2012-05-03 20:27 UTC (permalink / raw)
To: Sergio Durigan Junior; +Cc: tromey, jan.kratochvil, gdb-patches
On Thu, May 3, 2012 at 1:04 PM, Sergio Durigan Junior
<sergiodj@redhat.com> wrote:
> On Thursday, May 03 2012, Doug Evans wrote:
>
>> On Wed, May 2, 2012 at 11:56 AM, Sergio Durigan Junior
>> <sergiodj@redhat.com> wrote:
>
>>> You're right. Does this patch work for you?
>>>
>>> 2012-05-02 Sergio Durigan Junior <sergiodj@redhat.com>
>>>
>>> * stap-probe.c (stap_is_operator): Change declaration.
>>> (stap_get_opcode): Change return value.
>>> (stap_parse_argument_1): Update calls to `stap_get_opcode' and
>>> `stap_parse_argument_1'.
>>
>> Works great, thanks!
>
> Thanks, checked in:
>
> http://sourceware.org/ml/gdb-cvs/2012-05/msg00024.html
Awesome. Thanks.
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2012-05-03 20:27 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-05-02 8:17 [RFC] Fix build failure in stap-probe.c Doug Evans
2012-05-02 18:56 ` Sergio Durigan Junior
2012-05-03 17:53 ` Doug Evans
2012-05-03 20:05 ` Sergio Durigan Junior
2012-05-03 20:27 ` Doug Evans
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox