Problem with __gmp_expr
Marc Glisse
marc.glisse at inria.fr
Fri Jan 17 14:27:11 UTC 2014
On Fri, 17 Jan 2014, Niels Möller wrote:
> Marc Glisse <marc.glisse at inria.fr> writes:
>
>> In gmp, -m*a is a neg
>> expr that stores a ref to a mult expr that stores references to m and
>> a. Since you managed to postpone the evaluation of the expression, the
>> mult expr went out of scope (older versions of gcc don't crash because
>> they are not good at reusing space from dead objects).
>
> I don't understand these things, but it sounds very brittle.
Well, expression template libraries all come with a big WARNING sign...
This part of gmpxx has been this way since its creation (before I learnt
C++), and people didn't complain that much. std::valarray in gcc's
libstdc++ should have the same issues.
> If some
> usages are simply not supported by gmpxx, is there some way to either
> get a compile time error when a referenced expression goes out of scope,
> or at least some more *controlled* crash or assertion failure, without
> trashing random memory locations?
That doesn't seem easy. Maybe with a binary incompatible, invasive, debug
mode...
Note that the patch I posted (I don't think we want it for 5.2, it needs
more investigation) would make those cases valid. There would still be
crashing operations like:
mpq_class f(void);
auto x=-f()+1;
because in this case we would need to store the number returned by f, and
that can't be done cheaply as long as we don't have some form of lazy
initialization. Or we could do in-place operations on rvalues, but that
would also require a cheap move constructor (aka lazy init).
>> Other libraries would have a big neg expr that embeds a copy of the
>> mult expr,
>
> Now you're talking about copies of the expr objects used in the template
> machinery, not copies of the underlying numbers?
Yes, not the numbers (the part of the sentence you removed said that
mp?_class is not copied).
--
Marc Glisse
More information about the gmp-bugs
mailing list