News:

As usual while waiting for the next release - don't forget to check the nightly builds in the forum.

Main Menu

[Issue]: Cyclic loop resulting in a silent crash

Started by MortenMacFly, November 15, 2006, 07:48:13 PM

Previous topic - Next topic

MortenMacFly

I tried to "implement" a cbMessageBox at a certain position and suddenly C::B didn't run anymore - instead it crashed silently. I realised the following issue with cbMessageBox:

- if cbMessageBox is called PlaceWindow will be called, but:
- if cbMessageBox is called with a NULL parent pointer, PlaceWindow receives the same
- PlaceWindow with thus issue a cbThrow which will raise a cbException which will use a cbMessageBox
- this again will call PlaceWindow with a NULL pointer... and so on...

You get the idea. cbMessageBox is not safe at all time (speaking about construction/destruction phase)... What to do about this?

My suggestion: Change

    if(!w)
        cbThrow(_T("Passed NULL pointer to PlaceWindow."));

...in PlaceWindow to:

    if(!w)
        cbThrow(_T("Passed NULL pointer to PlaceWindow."), true);

...which uses a wxSafeShowMessage instead of cbMessageBox... any objections?

Thomas? Yiannis? Others?

With regards, Morten.
Compiler logging: Settings->Compiler & Debugger->tab "Other"->Compiler logging="Full command line"
C::B Manual: [url="https://www.codeblocks.org/docs/main_codeblocks_en.html"]https://www.codeblocks.org/docs/main_codeblocks_en.html[/url]
C::B FAQ: [url="https://wiki.codeblocks.org/index.php?title=FAQ"]https://wiki.codeblocks.org/index.php?title=FAQ[/url]

thomas

"We should forget about small efficiencies, say about 97% of the time: Premature quotation is the root of public humiliation."

mandrav

Be patient!
This bug will be fixed soon...

MortenMacFly

#3
Quote from: mandrav on November 15, 2006, 08:10:03 PM
Agreed.
Actually it's wrong. I mean: Using cbThrow(..., true) in PlaceWindow is ok.
But using wxMessageDialog in cbMessageBox with parent==NULL does not work anyway because wxMessageDialog *requires* a parent. I fixed it the following way:
In cbMessageBox, if parent==NULL use a wxMessageBox, otherwise use wxMessageDialog.

But: This limits the return values as they differ from wxMessageDialog. How to handle this (Will commit anytime soon for your inspection...)???

With regards, Morten.

Edit: I'll handle this by mapping the return values of wxMessageBox to the ones of wxMessageDialog. Committing now...
Compiler logging: Settings->Compiler & Debugger->tab "Other"->Compiler logging="Full command line"
C::B Manual: [url="https://www.codeblocks.org/docs/main_codeblocks_en.html"]https://www.codeblocks.org/docs/main_codeblocks_en.html[/url]
C::B FAQ: [url="https://wiki.codeblocks.org/index.php?title=FAQ"]https://wiki.codeblocks.org/index.php?title=FAQ[/url]

Pecan

Quote from: MortenMacFly on November 15, 2006, 08:27:03 PM
Edit: I'll handle this by mapping the return values of wxMessageBox to the ones of wxMessageDialog. Committing now...

Yeah. The samples do message box return code translation all over the place.
So does the source code for wxMessageBox.

MortenMacFly

#5
Quote from: Pecan on November 15, 2006, 09:39:39 PM
Yeah. The samples do message box return code translation all over the place.
So does the source code for wxMessageBox.
...that's good (:?:) to know... ;-)
With regards, Morten.
Compiler logging: Settings->Compiler & Debugger->tab "Other"->Compiler logging="Full command line"
C::B Manual: [url="https://www.codeblocks.org/docs/main_codeblocks_en.html"]https://www.codeblocks.org/docs/main_codeblocks_en.html[/url]
C::B FAQ: [url="https://wiki.codeblocks.org/index.php?title=FAQ"]https://wiki.codeblocks.org/index.php?title=FAQ[/url]