From c10d8daf9fb99b613eb19131479ea9be09c2fa50 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= <sebastien@dynare.org>
Date: Mon, 15 Apr 2019 18:32:59 +0200
Subject: [PATCH] Dynare++: add safety check to avoid overflow in tensor
 indices

Ref #217
---
 dynare++/tl/cc/tl_static.cc | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/dynare++/tl/cc/tl_static.cc b/dynare++/tl/cc/tl_static.cc
index 54c997c5e4..03a7b312d4 100644
--- a/dynare++/tl/cc/tl_static.cc
+++ b/dynare++/tl/cc/tl_static.cc
@@ -2,8 +2,11 @@
 
 #include "tl_static.hh"
 #include "pascal_triangle.hh"
+#include "tl_exception.hh"
 
 #include <mutex>
+#include <limits>
+#include <cmath>
 
 /* Note that we allow for repeated calls of |init|. This is not normal
    and the only purpose of allowing this is the test suite. */
@@ -29,6 +32,10 @@ namespace TLStatic
   void
   init(int dim, int nvar)
   {
+    // Check that tensor indices will not overflow (they are stored as signed int, hence on 31 bits)
+    if (std::log2(nvar)*dim > std::numeric_limits<int>::digits)
+      throw TLException(__FILE__, __LINE__, "Problem too large, you should decrease the approximation order");
+
     std::lock_guard<std::mutex>{mut};
     ebundle.generateUpTo(dim);
     pbundle.generateUpTo(dim);
-- 
GitLab