From fad14e531b1fa96211beac28557d7fb5d42a8b80 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Mon, 11 Mar 2013 12:22:16 +0000 Subject: Avoid invalid pointer to pointer conversions. Casts between 'char **' <-> 'unsigned char **' and 'char **' <-> const char **' are actually invalid: http://gcc.gnu.org/ml/gcc-help/2013-03/msg00118.html In a nutshell, char (and variants) can alias anything, but pointers to chars get no special treatment (cf. C99/N1256, 6.5/7). Turns out older gcc's actually warn/complain on these constructs, though newer one's don't: http://sourceware.org/ml/gdb-patches/2013-03/msg00429.html http://sourceware.org/ml/gdb-patches/2013-03/msg00430.html This patch fixes the cases I added last week. It also fixes one other preexisting case in charset.c, though it seems even older gccs don't complain of char * <-> const char * aliasing. Tested on x86_64 Fedora 17. gdb/ 2013-03-11 Pedro Alves * charset.c (convert_between_encodings): Don't cast between different pointer to pointer types. Instead, make the 'inp' local be of the type iconv expects. (wchar_iterate): Don't cast between different pointer to pointer types. Instead, use new pointer local of the type iconv expects. * target.c (target_read_stralloc, target_fileio_read_stralloc): Add new local of type char pointer, and use it to get a char/string view of the byte buffer, instead of casting between pointer to pointer types. --- gdb/target.c | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) (limited to 'gdb/target.c') diff --git a/gdb/target.c b/gdb/target.c index 0329da32adf..a961d7b831e 100644 --- a/gdb/target.c +++ b/gdb/target.c @@ -2378,11 +2378,12 @@ char * target_read_stralloc (struct target_ops *ops, enum target_object object, const char *annex) { - char *buffer; + gdb_byte *buffer; + char *bufstr; LONGEST i, transferred; - transferred = target_read_alloc_1 (ops, object, annex, - (gdb_byte **) &buffer, 1); + transferred = target_read_alloc_1 (ops, object, annex, &buffer, 1); + bufstr = (char *) buffer; if (transferred < 0) return NULL; @@ -2390,11 +2391,11 @@ target_read_stralloc (struct target_ops *ops, enum target_object object, if (transferred == 0) return xstrdup (""); - buffer[transferred] = 0; + bufstr[transferred] = 0; /* Check for embedded NUL bytes; but allow trailing NULs. */ - for (i = strlen (buffer); i < transferred; i++) - if (buffer[i] != 0) + for (i = strlen (bufstr); i < transferred; i++) + if (bufstr[i] != 0) { warning (_("target object %d, annex %s, " "contained unexpected null characters"), @@ -2402,7 +2403,7 @@ target_read_stralloc (struct target_ops *ops, enum target_object object, break; } - return buffer; + return bufstr; } /* Memory transfer methods. */ @@ -3542,11 +3543,12 @@ target_fileio_read_alloc (const char *filename, gdb_byte **buf_p) char * target_fileio_read_stralloc (const char *filename) { - char *buffer; + gdb_byte *buffer; + char *bufstr; LONGEST i, transferred; - transferred = target_fileio_read_alloc_1 (filename, - (gdb_byte **) &buffer, 1); + transferred = target_fileio_read_alloc_1 (filename, &buffer, 1); + bufstr = (char *) buffer; if (transferred < 0) return NULL; @@ -3554,11 +3556,11 @@ target_fileio_read_stralloc (const char *filename) if (transferred == 0) return xstrdup (""); - buffer[transferred] = 0; + bufstr[transferred] = 0; /* Check for embedded NUL bytes; but allow trailing NULs. */ - for (i = strlen (buffer); i < transferred; i++) - if (buffer[i] != 0) + for (i = strlen (bufstr); i < transferred; i++) + if (bufstr[i] != 0) { warning (_("target file %s " "contained unexpected null characters"), @@ -3566,7 +3568,7 @@ target_fileio_read_stralloc (const char *filename) break; } - return buffer; + return bufstr; } -- cgit v1.2.1