systemc: Add some error checks to some classes.
authorGabe Black <gabeblack@google.com>
Tue, 11 Sep 2018 23:16:49 +0000 (16:16 -0700)
committerGabe Black <gabeblack@google.com>
Tue, 9 Oct 2018 21:48:14 +0000 (21:48 +0000)
These check whether those classes are being constructed in legal
circumstances, and avoids a null pointer dereference.

Change-Id: Ied36ee15c3d7bf6ee444351a841c38576780298e
Reviewed-on: https://gem5-review.googlesource.com/c/12622
Reviewed-by: Gabe Black <gabeblack@google.com>
Maintainer: Gabe Black <gabeblack@google.com>

src/systemc/core/sc_export.cc
src/systemc/core/sc_port.cc
src/systemc/core/scheduler.cc
src/systemc/core/scheduler.hh

index 383552b1ad2ca0849555021a6dbc0be9a88f68f0..252f8c0ff9356881b4a4252f819366c33c859b92 100644 (file)
 
 #include "base/logging.hh"
 #include "systemc/core/module.hh"
+#include "systemc/core/scheduler.hh"
 #include "systemc/ext/core/sc_export.hh"
+#include "systemc/ext/core/sc_main.hh"
 
 namespace sc_core
 {
 
+namespace
+{
+
+void
+reportError(const char *id, const char *add_msg,
+        const char *name, const char *kind)
+{
+    std::string msg;
+    if (add_msg)
+        msg = csprintf("%s: export '%s' (%s)", add_msg, name, kind);
+    else
+        msg = csprintf("export '%s' (%s)", name, kind);
+
+    SC_REPORT_ERROR(id, msg.c_str());
+}
+
+}
+
 sc_export_base::sc_export_base(const char *n) : sc_object(n)
 {
+    if (sc_is_running()) {
+        reportError("(E121) insert sc_export failed", "simulation running",
+                n, kind());
+    }
+    if (::sc_gem5::scheduler.elaborationDone()) {
+        reportError("(E121) insert sc_export failed", "elaboration done",
+                n, kind());
+    }
+
     ::sc_gem5::Module *m = ::sc_gem5::currentModule();
-    m->exports.push_back(this);
+    if (!m) {
+        reportError("(E122) sc_export specified outside of module",
+                nullptr, n, kind());
+    } else {
+        m->exports.push_back(this);
+    }
 }
 sc_export_base::~sc_export_base() {}
 
index d10ceeab3289cae88a1b1b45c19f6c9dfc88d904..c822e966e5c37cfdb5e60ed7fb300c2de9c63eee 100644 (file)
 #include "base/logging.hh"
 #include "systemc/core/bindinfo.hh"
 #include "systemc/core/module.hh"
+#include "systemc/core/scheduler.hh"
+#include "systemc/ext/core/sc_main.hh"
 #include "systemc/ext/core/sc_port.hh"
 
 namespace sc_core
 {
 
+namespace
+{
+
+void
+reportError(const char *id, const char *add_msg,
+        const char *name, const char *kind)
+{
+    std::string msg;
+    if (add_msg)
+        msg = csprintf("%s: port '%s' (%s)", add_msg, name, kind);
+    else
+        msg = csprintf("port '%s' (%s)", name, kind);
+
+    SC_REPORT_ERROR(id, msg.c_str());
+}
+
+}
+
 sc_port_base::sc_port_base(const char *name, int n, sc_port_policy p) :
     sc_object(name), _maxSize(n), _size(0), finalized(false)
 {
+    if (sc_is_running()) {
+        reportError("(E110) insert port failed", "simulation running",
+                name, kind());
+    }
+    if (::sc_gem5::scheduler.elaborationDone()) {
+        reportError("(E110) insert port failed", "elaboration done",
+                name, kind());
+    }
+
     ::sc_gem5::Module *m = ::sc_gem5::currentModule();
-    m->ports.push_back(this);
+    if (!m) {
+        reportError("(E100) port specified outside of module",
+                nullptr, name, kind());
+    } else {
+        m->ports.push_back(this);
+    }
 }
 
 void
index fe00ac0f8d549cd03176fc192459f5b794c6ea92..a0695a39552ceb35f2b61b14879074e1fefeaaa9 100644 (file)
@@ -46,8 +46,8 @@ Scheduler::Scheduler() :
     stopEvent(this, false, StopPriority),
     scMain(nullptr), _throwToScMain(nullptr),
     starvationEvent(this, false, StarvationPriority),
-    _started(false), _stopNow(false), _status(StatusOther),
-    maxTickEvent(this, false, MaxTickPriority),
+    _elaborationDone(false), _started(false), _stopNow(false),
+    _status(StatusOther), maxTickEvent(this, false, MaxTickPriority),
     _numCycles(0), _changeStamp(0), _current(nullptr), initDone(false),
     runOnce(false), readyList(nullptr)
 {}
index 0bbc3dac682d5ff690b8cdb3e70ee762a16ddea4..33515ea432cc997608474da5aec0793845f6782d 100644 (file)
@@ -338,6 +338,9 @@ class Scheduler
         StatusStopped
     };
 
+    bool elaborationDone() { return _elaborationDone; }
+    void elaborationDone(bool b) { _elaborationDone = b; }
+
     bool paused() { return status() == StatusPaused; }
     bool stopped() { return status() == StatusStopped; }
     bool inDelta() { return status() == StatusDelta; }
@@ -410,6 +413,7 @@ class Scheduler
     EventWrapper<Scheduler, &Scheduler::pause> starvationEvent;
     void scheduleStarvationEvent();
 
+    bool _elaborationDone;
     bool _started;
     bool _stopNow;