[PPL-devel] Questionable feature of the C++ interface (GMP 4.0.1)

Roberto Bagnara bagnara at cs.unipr.it
Tue Mar 26 18:06:32 CET 2002


After a rather difficult debugging session I discovered a feature
of the C++ interface shipped with GMP 4.0.1 that is rather questionable.
The problem is exemplified by the following snippet:

//////////////////////////////////////////////////////////////////////////
#include <gmpxx.h>

typedef struct any_thing* any_pointer;

any_pointer bar();

void foo() {
   //int i = bar();      // This is flagged as an invalid conversion...
   mpz_class n = bar();  // ... but this one is happily accepted!
}
//////////////////////////////////////////////////////////////////////////

As you see, a pointer is erroneously used to initialize an mpz_class
object, but this is not and cannot be flagged by the compiler, not even
as a warning.  The reason is that <gmpxx.h> has a constructor defined
as

     __gmp_expr(bool b) { mpz_init_set_ui(mp, b); }

and the C++ standard specifies (clause 4.1.2, [conv.bool]) that

     An rvalue of arithmetic, enumeration, pointer, or pointer to member
     type can be converted to an rvalue of type bool. A zero value, null
     pointer value, or null member pointer value is converted to false;
     any other value is converted to true.

So what happens is that a pointer is converted to true or false and
then converted to 1 or 0 and this is what is used to initialize the
object.  Since this can give rise to bugs that are quite difficult
to diagnose, I propose the above constructor is removed altogether,
so that the compiler can complain loudly.
Notice that qualifying that constructor as `explicit' would not be
enough as

   mpz_class n = bar();

would be flagged as an error, but

   mpz_class n(bar());

would be happily accepted.  Removing the constructor would not cause
a significant loss in functionality since the rare cases where one
wants to do such a thing can be handled in several ways, most of which
are more readable and faithful to the actual intention that the examples
above.

I have mailed this message to the present list and not to bug-gmp
because

a) strictly speaking, this is not a bug;
b) other users may benefit from this information.

All the best

      Roberto

-- 
Prof. Roberto Bagnara
Computer Science Group
Department of Mathematics, University of Parma, Italy
http://www.cs.unipr.it/~bagnara/
mailto:bagnara at cs.unipr.it




More information about the PPL-devel mailing list