mem_t: Throw an error if zero-sized memory is requested (#168)
authorJonathan Neuschäfer <j.neuschaefer@gmx.net>
Tue, 9 Jan 2018 00:00:55 +0000 (01:00 +0100)
committerAndrew Waterman <aswaterman@gmail.com>
Tue, 9 Jan 2018 00:00:55 +0000 (16:00 -0800)
* mem_t: Throw an error if zero-sized memory is requested

If for some reason the user requests a memory size of 0 megabytes, print
a useful error message.

* Check for overflow in memory size

If the user passes in a large enough memory size (-m) that the size in
bytes doesn't fit into size_t, catch this error in the make_mems function.

riscv/devices.h
spike_main/spike.cc

index e4df6c9858862a3f7421e0162e5538dfa009e925..4e4d27ff609409a285cb2b60805f262a318186bc 100644 (file)
@@ -41,6 +41,8 @@ class rom_device_t : public abstract_device_t {
 class mem_t : public abstract_device_t {
  public:
   mem_t(size_t size) : len(size) {
+    if (!size)
+      throw std::runtime_error("zero bytes of target memory requested");
     data = (char*)calloc(1, size);
     if (!data)
       throw std::runtime_error("couldn't allocate " + std::to_string(size) + " bytes of target memory");
index 1205965f81e4b9eb661d7ea5816f35e30c00d4d4..d3caa2251e3c7a2282afaa015064927fe475aac3 100644 (file)
@@ -47,6 +47,8 @@ static std::vector<std::pair<reg_t, mem_t*>> make_mems(const char* arg)
   auto mb = strtoull(arg, &p, 0);
   if (*p == 0) {
     reg_t size = reg_t(mb) << 20;
+    if (size != (size_t)size)
+      throw std::runtime_error("Size would overflow size_t");
     return std::vector<std::pair<reg_t, mem_t*>>(1, std::make_pair(reg_t(DRAM_BASE), new mem_t(size)));
   }