More invalid pointer to pointer conversions.

As a follow up to:

  http://sourceware.org/ml/gdb-patches/2013-03/msg00449.html

In a nutshell, casts between 'char **' <-> 'unsigned char **' and
'char **' <-> 'const char **' are invalid.

I grepped for "\*\*) &" and found these.  There's another one in
demangle.c, but I've split fixing that one to a separate patch.

I think the ada_decode_symbol change is perhaps the one that could be
surprising.  The function's description has this comment, which makes
things much clearer:

   The GSYMBOL parameter is "mutable" in the C++ sense: logically
   const, but nevertheless modified to a semantically equivalent form
   when a decoded name is cached in it.  */

 const char *
 ada_decode_symbol (const struct general_symbol_info *gsymbol)

With that out of the way, I think the patch ends up being pretty
obvious.

Tested on x86_64 Fedora 17.

gdb/
2013-03-13  Pedro Alves  <palves@redhat.com>

	* ada-lang.c (ada_decode_symbol): Cast away constness of GSYMBOL
	rather than casting 'const char * const *' to 'const char **'.
	* ada-lex.l (processInt): Make "trailer" local const.  Remove
	'const char **' cast.
	* arm-linux-tdep.c (arm_stap_parse_special_token): Add 'char *'
	locals, and use those as strtol output pointer, instead than doing
	invalid casts to from 'const char **' to 'char **'.
	(_initialize_demangle): Remove cast.
	* i386-tdep.c (i386_stap_parse_special_token): : Add 'char *'
	locals, and use those as strtol output pointer, instead than doing
	invalid casts to from 'const char **' to 'char **'.
	* solib-dsbt.c (dsbt_get_initial_loadmaps): Remove 'gdb_byte**'
	casts.
	* stap-probe.c (stap_parse_register_operand)
	(stap_parse_single_operand): Likewise.
This commit is contained in:
Pedro Alves 2013-03-13 16:45:11 +00:00
parent 8ddb196517
commit a0bcdaa75e
7 changed files with 61 additions and 17 deletions

View File

@ -1,3 +1,21 @@
2013-03-13 Pedro Alves <palves@redhat.com>
* ada-lang.c (ada_decode_symbol): Cast away constness of GSYMBOL
rather than casting 'const char * const *' to 'const char **'.
* ada-lex.l (processInt): Make "trailer" local const. Remove
'const char **' cast.
* arm-linux-tdep.c (arm_stap_parse_special_token): Add 'char *'
locals, and use those as strtol output pointer, instead than doing
invalid casts to from 'const char **' to 'char **'.
(_initialize_demangle): Remove cast.
* i386-tdep.c (i386_stap_parse_special_token): : Add 'char *'
locals, and use those as strtol output pointer, instead than doing
invalid casts to from 'const char **' to 'char **'.
* solib-dsbt.c (dsbt_get_initial_loadmaps): Remove 'gdb_byte**'
casts.
* stap-probe.c (stap_parse_register_operand)
(stap_parse_single_operand): Likewise.
2013-03-13 Yao Qi <yao@codesourcery.com> 2013-03-13 Yao Qi <yao@codesourcery.com>
* tracepoint.c (tfile_get_trace_state_variable_value): Look for * tracepoint.c (tfile_get_trace_state_variable_value): Look for

View File

@ -1299,8 +1299,10 @@ static struct htab *decoded_names_store;
const char * const char *
ada_decode_symbol (const struct general_symbol_info *gsymbol) ada_decode_symbol (const struct general_symbol_info *gsymbol)
{ {
const char **resultp = struct general_symbol_info *gsymbol_rw
(const char **) &gsymbol->language_specific.mangled_lang.demangled_name; = (struct general_symbol_info *) gsymbol;
const char **resultp
= &gsymbol_rw->language_specific.mangled_lang.demangled_name;
if (*resultp == NULL) if (*resultp == NULL)
{ {

View File

@ -329,8 +329,7 @@ processInt (const char *base0, const char *num0, const char *exp0)
ULONGEST result; ULONGEST result;
long exp; long exp;
int base; int base;
const char *trailer;
char *trailer;
if (base0 == NULL) if (base0 == NULL)
base = 10; base = 10;
@ -347,7 +346,7 @@ processInt (const char *base0, const char *num0, const char *exp0)
exp = strtol(exp0, (char **) NULL, 10); exp = strtol(exp0, (char **) NULL, 10);
errno = 0; errno = 0;
result = strtoulst (num0, (const char **) &trailer, base); result = strtoulst (num0, &trailer, base);
if (errno == ERANGE) if (errno == ERANGE)
error (_("Integer literal out of range")); error (_("Integer literal out of range"));
if (isxdigit(*trailer)) if (isxdigit(*trailer))

View File

@ -1088,6 +1088,7 @@ arm_stap_parse_special_token (struct gdbarch *gdbarch,
{ {
/* Temporary holder for lookahead. */ /* Temporary holder for lookahead. */
const char *tmp = p->arg; const char *tmp = p->arg;
char *endp;
/* Used to save the register name. */ /* Used to save the register name. */
const char *start; const char *start;
char *regname; char *regname;
@ -1140,7 +1141,8 @@ arm_stap_parse_special_token (struct gdbarch *gdbarch,
got_minus = 1; got_minus = 1;
} }
displacement = strtol (tmp, (char **) &tmp, 10); displacement = strtol (tmp, &endp, 10);
tmp = endp;
/* Skipping last `]'. */ /* Skipping last `]'. */
if (*tmp++ != ']') if (*tmp++ != ']')

View File

@ -3494,6 +3494,7 @@ i386_stap_parse_special_token (struct gdbarch *gdbarch,
char *regname; char *regname;
int len; int len;
struct stoken str; struct stoken str;
char *endp;
got_minus[0] = 0; got_minus[0] = 0;
if (*s == '+') if (*s == '+')
@ -3504,7 +3505,8 @@ i386_stap_parse_special_token (struct gdbarch *gdbarch,
got_minus[0] = 1; got_minus[0] = 1;
} }
displacements[0] = strtol (s, (char **) &s, 10); displacements[0] = strtol (s, &endp, 10);
s = endp;
if (*s != '+' && *s != '-') if (*s != '+' && *s != '-')
{ {
@ -3521,7 +3523,8 @@ i386_stap_parse_special_token (struct gdbarch *gdbarch,
got_minus[1] = 1; got_minus[1] = 1;
} }
displacements[1] = strtol (s, (char **) &s, 10); displacements[1] = strtol (s, &endp, 10);
s = endp;
if (*s != '+' && *s != '-') if (*s != '+' && *s != '-')
{ {
@ -3538,7 +3541,8 @@ i386_stap_parse_special_token (struct gdbarch *gdbarch,
got_minus[2] = 1; got_minus[2] = 1;
} }
displacements[2] = strtol (s, (char **) &s, 10); displacements[2] = strtol (s, &endp, 10);
s = endp;
if (*s != '(' || s[1] != '%') if (*s != '(' || s[1] != '%')
break; break;
@ -3628,7 +3632,12 @@ i386_stap_parse_special_token (struct gdbarch *gdbarch,
break; break;
if (isdigit (*s)) if (isdigit (*s))
offset = strtol (s, (char **) &s, 10); {
char *endp;
offset = strtol (s, &endp, 10);
s = endp;
}
if (*s != '(' || s[1] != '%') if (*s != '(' || s[1] != '%')
break; break;
@ -3675,6 +3684,8 @@ i386_stap_parse_special_token (struct gdbarch *gdbarch,
if (*s == ',') if (*s == ',')
{ {
char *endp;
++s; ++s;
if (*s == '+') if (*s == '+')
++s; ++s;
@ -3684,7 +3695,8 @@ i386_stap_parse_special_token (struct gdbarch *gdbarch,
size_minus = 1; size_minus = 1;
} }
size = strtol (s, (char **) &s, 10); size = strtol (s, &endp, 10);
s = endp;
if (*s != ')') if (*s != ')')
break; break;

View File

@ -298,7 +298,7 @@ dsbt_get_initial_loadmaps (void)
struct dsbt_info *info = get_dsbt_info (); struct dsbt_info *info = get_dsbt_info ();
if (0 >= target_read_alloc (&current_target, TARGET_OBJECT_FDPIC, if (0 >= target_read_alloc (&current_target, TARGET_OBJECT_FDPIC,
"exec", (gdb_byte**) &buf)) "exec", &buf))
{ {
info->exec_loadmap = NULL; info->exec_loadmap = NULL;
error (_("Error reading DSBT exec loadmap")); error (_("Error reading DSBT exec loadmap"));
@ -308,7 +308,7 @@ dsbt_get_initial_loadmaps (void)
dsbt_print_loadmap (info->exec_loadmap); dsbt_print_loadmap (info->exec_loadmap);
if (0 >= target_read_alloc (&current_target, TARGET_OBJECT_FDPIC, if (0 >= target_read_alloc (&current_target, TARGET_OBJECT_FDPIC,
"interp", (gdb_byte**)&buf)) "interp", &buf))
{ {
info->interp_loadmap = NULL; info->interp_loadmap = NULL;
error (_("Error reading DSBT interp loadmap")); error (_("Error reading DSBT interp loadmap"));

View File

@ -422,9 +422,11 @@ stap_parse_register_operand (struct stap_parse_info *p)
{ {
/* The value of the displacement. */ /* The value of the displacement. */
long displacement; long displacement;
char *endp;
disp_p = 1; disp_p = 1;
displacement = strtol (p->arg, (char **) &p->arg, 10); displacement = strtol (p->arg, &endp, 10);
p->arg = endp;
/* Generating the expression for the displacement. */ /* Generating the expression for the displacement. */
write_exp_elt_opcode (OP_LONG); write_exp_elt_opcode (OP_LONG);
@ -598,7 +600,12 @@ stap_parse_single_operand (struct stap_parse_info *p)
tmp = skip_spaces_const (tmp); tmp = skip_spaces_const (tmp);
if (isdigit (*tmp)) if (isdigit (*tmp))
number = strtol (tmp, (char **) &tmp, 10); {
char *endp;
number = strtol (tmp, &endp, 10);
tmp = endp;
}
if (!reg_ind_prefix if (!reg_ind_prefix
|| strncmp (tmp, reg_ind_prefix, reg_ind_prefix_len) != 0) || strncmp (tmp, reg_ind_prefix, reg_ind_prefix_len) != 0)
@ -627,11 +634,13 @@ stap_parse_single_operand (struct stap_parse_info *p)
{ {
/* A temporary variable, needed for lookahead. */ /* A temporary variable, needed for lookahead. */
const char *tmp = p->arg; const char *tmp = p->arg;
char *endp;
long number; long number;
/* We can be dealing with a numeric constant (if `const_prefix' is /* We can be dealing with a numeric constant (if `const_prefix' is
NULL), or with a register displacement. */ NULL), or with a register displacement. */
number = strtol (tmp, (char **) &tmp, 10); number = strtol (tmp, &endp, 10);
tmp = endp;
if (p->inside_paren_p) if (p->inside_paren_p)
tmp = skip_spaces_const (tmp); tmp = skip_spaces_const (tmp);
@ -667,9 +676,11 @@ stap_parse_single_operand (struct stap_parse_info *p)
{ {
/* We are dealing with a numeric constant. */ /* We are dealing with a numeric constant. */
long number; long number;
char *endp;
p->arg += const_prefix_len; p->arg += const_prefix_len;
number = strtol (p->arg, (char **) &p->arg, 10); number = strtol (p->arg, &endp, 10);
p->arg = endp;
write_exp_elt_opcode (OP_LONG); write_exp_elt_opcode (OP_LONG);
write_exp_elt_type (builtin_type (gdbarch)->builtin_long); write_exp_elt_type (builtin_type (gdbarch)->builtin_long);