Fix off-by-one in call to vector::reserve
authorTom Tromey <tromey@adacore.com>
Fri, 18 Aug 2023 13:55:30 +0000 (07:55 -0600)
committerTom Tromey <tromey@adacore.com>
Fri, 18 Aug 2023 19:03:23 +0000 (13:03 -0600)
While looking at a bug, I noticed what I think is an off-by-one
mistake in a call to vector::reserve.  This code:

      new_args.reserve (args.size ());
      new_args.push_back
(value_from_pointer (lookup_pointer_type (values_type), struct_addr));
      new_args.insert (new_args.end (), args.begin (), args.end ());

... reserves 'size()' entries, but then proceeds to push one extra
one.

This shouldn't have any really bad effects, as insert will grow the
vector.  Still, it seems better to use the correct size if we're going
to bother calling reserve.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30780
Reviewed-by: John Baldwin <jhb@FreeBSD.org>
gdb/infcall.c

index bea5b185ddc2afd6c5a91550c5a2d61f6e1b757d..41ed3ed73a17869f728bf293c2fda5a8b6d3d792 100644 (file)
@@ -1233,7 +1233,7 @@ call_function_by_hand_dummy (struct value *function,
   if (return_method == return_method_hidden_param)
     {
       /* Add the new argument to the front of the argument list.  */
-      new_args.reserve (args.size ());
+      new_args.reserve (1 + args.size ());
       new_args.push_back
        (value_from_pointer (lookup_pointer_type (values_type), struct_addr));
       new_args.insert (new_args.end (), args.begin (), args.end ());