misc: Fix a bunch of minor issues identified by static analysis
authorAndreas Hansson <andreas.hansson@arm.com>
Sat, 27 Sep 2014 13:08:29 +0000 (09:08 -0400)
committerAndreas Hansson <andreas.hansson@arm.com>
Sat, 27 Sep 2014 13:08:29 +0000 (09:08 -0400)
Add some missing initialisation, and fix a handful benign resource
leaks (including some false positives).

src/base/output.cc
src/base/socket.cc
src/cpu/testers/rubytest/RubyTester.cc
src/mem/cache/cache_impl.hh
src/mem/comm_monitor.cc
src/mem/comm_monitor.hh
src/mem/packet.hh
src/mem/physical.cc
src/mem/ruby/system/RubyPort.cc
src/sim/eventq.cc
src/sim/eventq.hh

index 912ec20e90da5c3d88fc9f9da817d85385abcf2e..da9a551fa6b312f58bbb3eae01f2ba0b27673ad2 100644 (file)
@@ -255,6 +255,8 @@ OutputDirectory::remove(const string &name, bool recursive)
 
                 de = readdir(subdir);
             }
+
+            closedir(subdir);
         }
 
         // try to force recognition that we deleted the files in the directory
index c39accd7e80f0b28cefa853d49dc4da323209367..01fb519b4691c5ceb34b2e1434cb1705d6d9d95f 100644 (file)
@@ -94,8 +94,9 @@ ListenSocket::listen(int port, bool reuse)
     struct sockaddr_in sockaddr;
     sockaddr.sin_family = PF_INET;
     sockaddr.sin_addr.s_addr = INADDR_ANY;
-
     sockaddr.sin_port = htons(port);
+    // finally clear sin_zero
+    memset(&sockaddr.sin_zero, 0, sizeof(sockaddr.sin_zero));
     int ret = ::bind(fd, (struct sockaddr *)&sockaddr, sizeof (sockaddr));
     if (ret != 0) {
         if (ret == -1 && errno != EADDRINUSE)
@@ -126,7 +127,9 @@ ListenSocket::accept(bool nodelay)
     int sfd = ::accept(fd, (struct sockaddr *)&sockaddr, &slen);
     if (sfd != -1 && nodelay) {
         int i = 1;
-        ::setsockopt(sfd, IPPROTO_TCP, TCP_NODELAY, (char *)&i, sizeof(i));
+        if (::setsockopt(sfd, IPPROTO_TCP, TCP_NODELAY, (char *)&i,
+                         sizeof(i)) < 0)
+            warn("ListenSocket(accept): setsockopt() TCP_NODELAY failed!");
     }
 
     return sfd;
index 229b3e0a9d29d353881547c95f9e00cb3c4c2632..6ac2526127d7f504f8e2cce016475d3b4c87e144 100644 (file)
 RubyTester::RubyTester(const Params *p)
   : MemObject(p), checkStartEvent(this),
     _masterId(p->system->getMasterId(name())),
+    m_checkTable_ptr(nullptr),
     m_num_cpus(p->num_cpus),
     m_checks_to_complete(p->checks_to_complete),
     m_deadlock_threshold(p->deadlock_threshold),
+    m_num_writers(0),
+    m_num_readers(0),
     m_wakeup_frequency(p->wakeup_frequency),
     m_check_flush(p->check_flush),
     m_num_inst_ports(p->port_cpuInstPort_connection_count)
index e4a6f3c242506348b5c0dfedc7b97fdb8dd146cc..5cfe7c0cfd7c7a0ddfa466b8c3536fd411eb8ab4 100644 (file)
@@ -917,6 +917,9 @@ Cache<TagStore>::recvAtomic(PacketPtr pkt)
     if (pkt->cmd == MemCmd::WriteInvalidateReq) {
         memSidePort->sendAtomic(pkt); // complete writeback
         if (isTopLevel) {
+            // @todo Static analysis suggests this can actually happen
+            assert(blk);
+
             // top level caches allocate and write the data
             assert(blk->isDirty());
             assert(!blk->isWritable());
index 3c3af76ea9417efdb8a9df09cfb1e0e485902c08..c9cbcb143d395f9bd68e2d9fbff64a4aa074123f 100644 (file)
@@ -105,6 +105,12 @@ CommMonitor::CommMonitor(Params* params)
             name(), samplePeriodTicks, samplePeriod.msec());
 }
 
+CommMonitor::~CommMonitor()
+{
+    // if not already done, close the stream
+    closeStreams();
+}
+
 void
 CommMonitor::closeStreams()
 {
index c3a97094057c06f15adaff8898fb85fa716a1883..69122cc6042f19b6055aad3a41240bd0fb9edb94 100644 (file)
@@ -77,7 +77,7 @@ class CommMonitor : public MemObject
     CommMonitor(Params* params);
 
     /** Destructor */
-    ~CommMonitor() {}
+    ~CommMonitor();
 
     /**
      * Callback to flush and close all open output streams on exit. If
index 4ed307f66e57d2b192afce39292020de5218e423..c7b47c0a72acf064263a9dee59194226bfe27e9f 100644 (file)
@@ -601,7 +601,7 @@ class Packet : public Printable
      */
     Packet(Request *_req, MemCmd _cmd)
         :  cmd(_cmd), req(_req), data(nullptr), addr(0), _isSecure(false),
-           src(InvalidPortID), dest(InvalidPortID),
+           size(0), src(InvalidPortID), dest(InvalidPortID),
            bytesValidStart(0), bytesValidEnd(0),
            firstWordDelay(0), lastWordDelay(0),
            senderState(NULL)
index 08ec83410ffc1d5a8fb1621bc6d0f9bdb6a0310f..398d0530f56581d693fbc6cb48d78818c7359e43 100644 (file)
@@ -307,16 +307,9 @@ PhysicalMemory::serializeStore(ostream& os, unsigned int store_id,
 
     // write memory file
     string filepath = Checkpoint::dir() + "/" + filename.c_str();
-    int fd = creat(filepath.c_str(), 0664);
-    if (fd < 0) {
-        perror("creat");
-        fatal("Can't open physical memory checkpoint file '%s'\n",
-              filename);
-    }
-
-    gzFile compressed_mem = gzdopen(fd, "wb");
+    gzFile compressed_mem = gzopen(filepath.c_str(), "wb");
     if (compressed_mem == NULL)
-        fatal("Insufficient memory to allocate compression state for %s\n",
+        fatal("Can't open physical memory checkpoint file '%s'\n",
               filename);
 
     uint64_t pass_size = 0;
@@ -380,16 +373,9 @@ PhysicalMemory::unserializeStore(Checkpoint* cp, const string& section)
     string filepath = cp->cptDir + "/" + filename;
 
     // mmap memoryfile
-    int fd = open(filepath.c_str(), O_RDONLY);
-    if (fd < 0) {
-        perror("open");
-        fatal("Can't open physical memory checkpoint file '%s'", filename);
-    }
-
-    gzFile compressed_mem = gzdopen(fd, "rb");
+    gzFile compressed_mem = gzopen(filepath.c_str(), "rb");
     if (compressed_mem == NULL)
-        fatal("Insufficient memory to allocate compression state for %s\n",
-              filename);
+        fatal("Can't open physical memory checkpoint file '%s'", filename);
 
     // we've already got the actual backing store mapped
     uint8_t* pmem = backingStore[store_id].second;
index 110b6924dc2ce9441c16ebbfbc9c58d7d083fd2f..71b08ebbb4ef8f4c934079c00de9c0e03aa847a1 100644 (file)
@@ -205,7 +205,11 @@ RubyPort::PioSlavePort::recvTimingReq(PacketPtr pkt)
         AddrRangeList l = ruby_port->master_ports[i]->getAddrRanges();
         for (auto it = l.begin(); it != l.end(); ++it) {
             if (it->contains(pkt->getAddr())) {
-                ruby_port->master_ports[i]->sendTimingReq(pkt);
+                // generally it is not safe to assume success here as
+                // the port could be blocked
+                bool M5_VAR_USED success =
+                    ruby_port->master_ports[i]->sendTimingReq(pkt);
+                assert(success);
                 return true;
             }
         }
index b8e45a13e23d6fea82edfa4eb8fa1595d816e0ad..4fde796564df352669eecaa38180ef94e21e2450 100644 (file)
@@ -460,29 +460,28 @@ Event::dump() const
 }
 
 EventQueue::EventQueue(const string &n)
-    : objName(n), head(NULL), _curTick(0),
-    async_queue_mutex(new std::mutex())
+    : objName(n), head(NULL), _curTick(0)
 {
 }
 
 void
 EventQueue::asyncInsert(Event *event)
 {
-    async_queue_mutex->lock();
+    async_queue_mutex.lock();
     async_queue.push_back(event);
-    async_queue_mutex->unlock();
+    async_queue_mutex.unlock();
 }
 
 void
 EventQueue::handleAsyncInsertions()
 {
     assert(this == curEventQueue());
-    async_queue_mutex->lock();
+    async_queue_mutex.lock();
 
     while (!async_queue.empty()) {
         insert(async_queue.front());
         async_queue.pop_front();
     }
 
-    async_queue_mutex->unlock();
+    async_queue_mutex.unlock();
 }
index e238785f67c527a7437e9f8c14e9c4f45a6fe1df..c390d2155c8bd70e6823b17d6bdd85b49b63c26d 100644 (file)
@@ -42,6 +42,7 @@
 #include <cassert>
 #include <climits>
 #include <iosfwd>
+#include <memory>
 #include <mutex>
 #include <string>
 
@@ -448,7 +449,7 @@ class EventQueue : public Serializable
     Tick _curTick;
 
     //! Mutex to protect async queue.
-    std::mutex *async_queue_mutex;
+    std::mutex async_queue_mutex;
 
     //! List of events added by other threads to this event queue.
     std::list<Event*> async_queue;