Hello,
We have been using the 1.44.0 release of polygon for some internal
projects and have come across a number of oddities. The first one
I've got is a valgrind error when normalizing polygons with
numerically large coordinate values. Using the gmp_override.hpp
header does resolve these problems, but my understanding is that it is
the intent for the library to merely be numerically imprecise, rather
than crash, for coordinates which are too large.
Our simplified test case is below, and was compiled on an AMD64 Ubuntu
10.4 system. The first call to Normalize has no problems, but the
second call causes valgrind to report both uninitialized memory usage
and invalid reads. (I can produce the valgrind log on demand, but it
is somewhat large for inclusion in an email). While we have deployed
1.44.0 internally, I tested against the most recent svn version and
the problem still exists.
Is this merely a mis-use of the API?
Regards,
Josh Pieper
------------------------
#include
#include "boost_polygon/r66294/polygon/polygon.hpp"
typedef boost::polygon::point_data BoostPoint;
typedef boost::polygon::polygon_data BoostPolygon;
typedef boost::polygon::polygon_set_data BoostPolygonSet;
typedef boost::polygon::polygon_with_holes_data BoostPolygonWithHoles;
typedef std::vector<BoostPolygonWithHoles> BoostPolygonWithHolesVector;
template <typename Array>
void Normalize(const Array& data, int32_t scale) {
std::vector<BoostPoint> points;
for (size_t i = 0; i < sizeof(data) / sizeof(*data); i += 2) {
points.push_back(BoostPoint(data[i] / scale, data[i + 1] / scale));
}
using namespace boost::polygon::operators;
BoostPolygonSet poly_set;
poly_set |= BoostPolygon(points.begin(), points.end());
BoostPolygonWithHolesVector normal;
poly_set.get(normal);
}
int main() {
int32_t data[] = {
0, 0,
-1000000, -1000000,
19000000, -1000000,
18292893, 707106,
8292893, -9292893,
8170784, -9440890,
8078584, -9610754,
8000000, -10000000,
8078584, -10389245,
8170784, -10559109,
8292893, -10707106,
18292893, -20707106,
19000000, -19000000,
-1000000, -19000000,
0, -20000000,
0, 0,
};
Normalize(data, 10); // Fine.
Normalize(data, 1); // Crashes.
}