systemc: Change how SC_BIND_PROXY_NIL is initialized.
authorGabe Black <gabeblack@google.com>
Fri, 2 Nov 2018 22:30:41 +0000 (15:30 -0700)
committerGabe Black <gabeblack@google.com>
Mon, 5 Nov 2018 23:09:01 +0000 (23:09 +0000)
The previous implementation dereferenced a null pointer to create a
reference which would then have its address taken in the sc_bind_proxy
constructor. clang says that that uses undefined behavior, so this
change adds a default constructor which initializes the two contained
pointers to null explicitly.

We have to hope systemc code doesn't play around with sc_bind_proxy too
much and doesn't accidentally use this constructor unintentionally, but
it seems like the least bad possible solution which makes clang happy.

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

src/systemc/core/sc_module.cc
src/systemc/ext/core/sc_module.hh

index 5d9e3da1563f9cd476d04e32df99913c2bcb5665..fc98aa3a0056bbd19eb195ef7ccb9feaee889278 100644 (file)
@@ -102,6 +102,8 @@ newCThreadProcess(const char *name, ProcessFuncWrapper *func)
 namespace sc_core
 {
 
+sc_bind_proxy::sc_bind_proxy() : _interface(nullptr), _port(nullptr) {}
+
 sc_bind_proxy::sc_bind_proxy(sc_interface &_interface) :
     _interface(&_interface), _port(nullptr)
 {}
@@ -110,12 +112,10 @@ sc_bind_proxy::sc_bind_proxy(sc_port_base &_port) :
     _interface(nullptr), _port(&_port)
 {}
 
-const sc_bind_proxy SC_BIND_PROXY_NUL(*(sc_port_base *)nullptr);
+const sc_bind_proxy SC_BIND_PROXY_NIL;
 
 sc_module::~sc_module() { delete _gem5_module; }
 
-const sc_bind_proxy SC_BIND_PROXY_NIL(*(sc_port_base *)nullptr);
-
 void
 sc_module::operator () (const sc_bind_proxy &p001,
                         const sc_bind_proxy &p002,
index dea728fba79bc71664aad2118c682c6248c64c79..0c8bd9f6c7a1528db500f4f214cc6d317576c154 100644 (file)
@@ -82,6 +82,7 @@ class sc_bind_proxy
     sc_port_base *_port;
 
   public:
+    sc_bind_proxy();
     sc_bind_proxy(sc_interface &_interface);
     sc_bind_proxy(sc_port_base &_port);