Skip to content

Commit f7eeb82

Browse files
committed
Fix SEGV on Solaris x86
On Solaris x86, with both GCC 4.8 and 4.9, running cppcheck causes a segmentation fault when process terminates. The backtrace (dbx) where =>[1] _ZNSt14_List_iteratorIP5CheckEppEv(0x804798c, 0x8047994, 0xc0d61d6, 0x291a), at 0x8291b7c [2] std::list<Check*, std::allocator, <Check*>void>::remove(0x84ab328, 0x80479c8, 0x80479d4, 0x82d96fc), at 0x82da984 [3] Check::~Check(0x84a9fc4, 0x83d232c, 0xfef411fb, 0x83d135c), at 0x82d9709 [4] CheckExceptionSafety::~CheckExceptionSafety(0x84a9fc4, 0xfee82a40, 0xfee82a40, 0xfedcf000), at 0x8311e7d [5] __static_initialization_and_destruction_0(0x0, 0xffff, 0xfedd4c80, 0xfedcf000), at 0x81b01f8 [6] _GLOBAL__sub_D__ZN20CheckExceptionSafety11destructorsEv(0x83d135c, 0xfedd4f18, 0x8047a50, 0x828a5f5, 0xfedcf000, 0x8047a68), at 0x81b023c [7] __do_global_dtors_aux(0xfedcf000, 0x8047a68, 0xfece28cd, 0x8047b08, 0x8047a48, 0xfedcf000), at 0x8185b90 [8] _fini(0x8047b08, 0x8047a48, 0xfedcf000, 0xfedd4f00, 0x8047a80, 0xfecd4e72), at 0x828a5f5 [9] _exithandle(0xfeffb7d8, 0x8185a1a, 0x0, 0x0, 0x0, 0x0), at 0xfece28cd [10] exit(0x1, 0x8047b70, 0x0, 0x8047ba3, 0x8047bba, 0x8047ce6), at 0xfecd4e72 The destructor order is somehow getting messed up on this platform. This fix moves the code away from header file and ensures _instances remains valid during termination.
1 parent 9233e79 commit f7eeb82

File tree

2 files changed

+5
-4
lines changed

2 files changed

+5
-4
lines changed

lib/check.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,3 +42,7 @@ void Check::reportError(const ErrorLogger::ErrorMessage &errmsg)
4242
{
4343
std::cout << errmsg.toXML(true, 1) << std::endl;
4444
}
45+
std::list<Check *> &Check::instances() {
46+
static std::list<Check *> *_instances= new std::list<Check *>;
47+
return *_instances;
48+
}

lib/check.h

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,7 @@ class CPPCHECKLIB Check {
5353
}
5454

5555
/** List of registered check classes. This is used by Cppcheck to run checks and generate documentation */
56-
static std::list<Check *> &instances() {
57-
static std::list<Check *> _instances;
58-
return _instances;
59-
}
56+
static std::list<Check *> &instances();
6057

6158
/** run checks, the token list is not simplified */
6259
virtual void runChecks(const Tokenizer *, const Settings *, ErrorLogger *) {

0 commit comments

Comments
 (0)