Re: Trivial bug in valarith.c

Jim Ingham
2001-10-13T18:11:00Z

Andrew,

> JimB,
>
> While this looks, er obvious, can you give it a quick peek (I think you
> last touched that code ;-). Looks like this problem is also on the 5.1
> branch :-/

cvs tattle points the finger at Jim... He changed value_from_longest -
which presumably doesn't care whether it is handed a pointer or a
typedef, to value_from_pointer which does. That change is correct, you
just have to be careful about the arguments.

Another possible way to fix this, BTW, is to have value_from_pointer
call check_typedef before whinging about the type. Since check_typedef
can sometimes take a bit of work, however, I thought it was better to
keep the contract that you have to pass value_from_pointer a real
pointer, and let the callers do the work - which in most cases they will
have done already anyway.

>
> JimI,
>
> Do you have the ChangeLog entry? Any chance of a testcase?

Oops, forgot the ChangeLog. Here it is:

2001-10-12 Jim Ingham <jingham@inghji.apple.com>

* valarith.c (value_sub): Don't pass a raw type to
value_from_pointer, it has to go through check_typedef first.

If I don't get distracted by some other emergency, I will whip up a
testcase on Monday.

> BTW, I guess:
> (gdb) x/b myPtr+1
> also causes the crash - that is slightly more valid.

Yes, that will cause the problem too. Anything that calls value_sub to
handle a pointer +- integer where the pointer's type is a typedef
instead of a direct pointer will fall over - it doesn't matter how you
format the output.
The original case I was sent was a pointer to some opaque Foundation
type, and I guess x/x made sense in that case, I have no idea. I just
changed the example to something that would not require GnuStep or MacOS
X...

Jim

>
> enjoy,
> Andrew
>
>
>> Hi, all...
>> There's a trivial bug in valarith.c, in value_sub. Here is the patch:
>> Index: valarith.c
>> ===================================================================
>> RCS file: /cvs/src/src/gdb/valarith.c,v
>> retrieving revision 1.9
>> diff -c -w -r1.9 valarith.c
>> *** valarith.c 2001/09/24 17:16:53 1.9
>> --- valarith.c 2001/10/13 05:03:06
>> ***************
>> *** 104,110 ****
>> {
>> /* pointer - integer. */
>> LONGEST sz = TYPE_LENGTH (check_typedef (TYPE_TARGET_TYPE
>> (type1)));
>> ! return value_from_pointer (VALUE_TYPE (arg1),
>> (value_as_pointer (arg1)
>> - (sz * value_as_long (arg2))));
>> }
>> --- 104,110 ----
>> {
>> /* pointer - integer. */
>> LONGEST sz = TYPE_LENGTH (check_typedef (TYPE_TARGET_TYPE
>> (type1)));
>> ! return value_from_pointer (type1,
>> (value_as_pointer (arg1)
>> - (sz * value_as_long (arg2))));
>> }
>
>
>
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-
Jim Ingham
jingham@apple.com
Developer Tools - gdb