From c10d8daf9fb99b613eb19131479ea9be09c2fa50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Villemot?= 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 54c997c5e..03a7b312d 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 +#include +#include /* 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::digits) + throw TLException(__FILE__, __LINE__, "Problem too large, you should decrease the approximation order"); + std::lock_guard{mut}; ebundle.generateUpTo(dim); pbundle.generateUpTo(dim);