
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 <stdint.h> #include "boost_polygon/r66294/polygon/polygon.hpp" typedef boost::polygon::point_data<int32_t> BoostPoint; typedef boost::polygon::polygon_data<int32_t> BoostPolygon; typedef boost::polygon::polygon_set_data<int32_t> BoostPolygonSet; typedef boost::polygon::polygon_with_holes_data<int32_t> 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. }