This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH5 PR gdb/16959] gdb hangs in infinite recursion




On 3/29/2018 10:08 PM, Simon Marchi wrote:
On 2018-03-28 16:44, Weimin Pan wrote:
The original problem was fixed (see related PR 22242). But using a typedef as the declared type for a static member variable, as commented in this PR,
is still causing gdb to get into infinite loop when printing the static
member's value. This problem can be reproduced as follows:

% cat t.cc
class A {
    typedef A type;
public:
    bool operator==(const type& other) { return true; }

    static const type INSTANCE;
};

const A A::INSTANCE;

int main() {
    A a;
    if (a == A::INSTANCE) {
        return -1;
    }
    return 0;
}
% g++ -g t.cc
% gdb -ex "start" -ex "p a" a.out

The fix is rather trivial - in cp_print_static_field(), should call
check_typedef() to get the static member's real type and use it to
check whether it's a struct or an array.

As Simon suggested, I've added a new test case to the testsuite
and am passing the original type, not the real type, as argument
to both cp_print_value_fields() and val_print().

Re-tested on both aarch64-linux-gnu and amd64-linux-gnu. No regressions.

Hi Weimin,

Could you change the title to something more descriptive about what the change/fix is, rather than the problem being fixed?  For example, "Fix infinite recursion when printing static member with typedef".

It is ok to push with that fixed (feel free to ask if you still need some guidance).

Thanks!

Simon
Hi Simon,

I just got started to work on this. Here is what I've done (I followed
your lead to creat a different remote name):

% git add <newfile>
% git commit -a
% git remote add upstream ssh://sourceware.org/git/binutils-gdb.git
% git fetch upstream

I have a few questions:

 * Do I need to do a "git merge" after "git fetch"? Or can I just
   do "git pull" which is equivalent to "git fetch;git merge"?
   (I was a Mercurial(hg) user, its typical workflow is like:
    hg in; do work; hg commit; hg pull; hg rebase(if needed); hg push)

 * In your previous email, you said:

   Make sure you inserted the ChangeLog entries in the actual ChangeLog files
   and amended your commit

   It seems the "git commit -a" command will contain all the changes, including
   those in ChangeLog files. Why do I have to insert the entries?

 * Changing the commit title to be be more descriptive:

   So I need to use "git commit --amend" to change the title?

Thanks very much for your help.

Weimin


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]