فهرست منبع

Oops, StringImpl's "the empty string" global was not always initialized.

These "oops forgot to initialize" bugs are getting annoying...
Andreas Kling 6 سال پیش
والد
کامیت
702d308e67
3فایلهای تغییر یافته به همراه14 افزوده شده و 7 حذف شده
  1. 9 4
      AK/StringImpl.cpp
  2. 1 0
      AK/StringImpl.h
  3. 4 3
      Kernel/init.cpp

+ 9 - 4
AK/StringImpl.cpp

@@ -4,12 +4,17 @@
 
 
 namespace AK {
 namespace AK {
 
 
+static StringImpl* s_theEmptyStringImpl = nullptr;
+
+void StringImpl::initializeGlobals()
+{
+    s_theEmptyStringImpl = new StringImpl(ConstructTheEmptyStringImpl);;
+}
+
 StringImpl& StringImpl::theEmptyStringImpl()
 StringImpl& StringImpl::theEmptyStringImpl()
 {
 {
-    static StringImpl* s = nullptr;
-    if (!s)
-        s = new StringImpl(ConstructTheEmptyStringImpl);
-    return *s;
+    ASSERT(s_theEmptyStringImpl);
+    return *s_theEmptyStringImpl;
 }
 }
 
 
 StringImpl::~StringImpl()
 StringImpl::~StringImpl()

+ 1 - 0
AK/StringImpl.h

@@ -15,6 +15,7 @@ public:
     RetainPtr<StringImpl> toUppercase() const;
     RetainPtr<StringImpl> toUppercase() const;
 
 
     static StringImpl& theEmptyStringImpl();
     static StringImpl& theEmptyStringImpl();
+    static void initializeGlobals();
 
 
     ~StringImpl();
     ~StringImpl();
 
 

+ 4 - 3
Kernel/init.cpp

@@ -27,7 +27,7 @@
 #include "Console.h"
 #include "Console.h"
 
 
 #define TEST_VFS
 #define TEST_VFS
-//#define TEST_ELF_LOADER
+#define TEST_ELF_LOADER
 //#define TEST_CRASHY_USER_PROCESSES
 //#define TEST_CRASHY_USER_PROCESSES
 
 
 static void motd_main() NORETURN;
 static void motd_main() NORETURN;
@@ -102,8 +102,6 @@ static void init_stage2()
     // Anything that registers interrupts goes *after* PIC and IDT for obvious reasons.
     // Anything that registers interrupts goes *after* PIC and IDT for obvious reasons.
     Syscall::initialize();
     Syscall::initialize();
 
 
-    VirtualFileSystem::initializeGlobals();
-
     extern void panel_main();
     extern void panel_main();
 
 
     new Task(panel_main, "panel", IPC::Handle::PanelTask, Task::Ring0);
     new Task(panel_main, "panel", IPC::Handle::PanelTask, Task::Ring0);
@@ -203,6 +201,9 @@ void init()
 
 
     MemoryManager::initialize();
     MemoryManager::initialize();
 
 
+    VirtualFileSystem::initializeGlobals();
+    StringImpl::initializeGlobals();
+
     auto keyboard = make<Keyboard>();
     auto keyboard = make<Keyboard>();
 
 
     PIT::initialize();
     PIT::initialize();