Re: MI failures related to string printing

Mark Kettenis
2007-01-12T11:22:03Z

> From: Vladimir Prus <vladimir@codesourcery.com>
> Date: Fri, 12 Jan 2007 13:51:29 +0300
>
>
> As I've reported before, I'm getting this failure:
>
> FAIL: gdb.mi/mi-var-child.exp: update all vars psnp->next->next->long_ptr (and 2.long_ptr) changed
>
> After investigation, it appears related to recent -var-update changes. The failing test
> does:
>
> mi_gdb_test "-var-update *" \
> "\\^done,changelist=\\\[\{name=\"psnp->ptrs.0.next.next.long_ptr\",in_scope=\"true\",type_changed=\"false\"\}\\\]" \
> "update all vars psnp->next->next->long_ptr (and 2.long_ptr) changed"
>
> It's the last check in mi-var-child.exp. The reply from gdb includes also:
>
> {name="psnp->char_ptr.*psnp->char_ptr.**psnp->char_ptr.***psnp->char_ptr",in_scope="true",type_changed="false"}
>
> and another similar thing. The problem is that test is written like this:
>
> char a0, *a1, **a2, ***a3;
>
> a0 = '0';
> a1 = &a0;
> a2 = &a1;
> a3 = &a2;
>
> There's a variable object correspoding to a1. When varobj_update tries to compare old
> and new value of that varobj, it computes string value of a1. Unfortunately, a1 points to
> a single character. There's no terminating zero character. So, the string value of a1 is
> essentially random, and -var-update randomly marks varobj as changed.
>
> What do we do about it? At the very least, the test should be fixed. Is there anything smart
> we can do here?

I think the whole idea of doing string comparisons for C (or C++)
"char *" pointers is flawed. There is no guarantee that a "char *"
actually points to a null-terminated as the test shows. You should
not treat "char *" any different from other pointers like "int *", at
least not by default. You could implement a way for the user to
specify that a "char *" is actually a pointer to a string instead of a
single character. But otherwise I think the string comparison should
only do for languages that have a genuine string type, such as Pascal.

Mark