Boost logo

Boost Users :

Subject: [Boost-users] Changelog for 1.47.0 does not properly warn about critical bug
From: Paul Harris (harris.pc_at_[hidden])
Date: 2011-08-05 07:20:50


Hello, I discovered this bug by accident
https://svn.boost.org/trac/boost/changeset/68866
which was only linked via the ticket mentioned below,

The code below demonstrates that ANY wide-character string of the same
length resolves to the same UUID !

Thats pretty darn serious, I expected to see a much more serious mention in
the Changelog in boost 1.47.0... for UUID, there was only a mention of a few
tickets
including this one:
 https://svn.boost.org/trac/boost/ticket/5145
which only mentioned a WARNING in the description !
"Fixed warning: use of logical && with constant operand; switch to bitwise &
or remove constant [-Wconstant-logical-operand]"

Surely it should say something like "UUIDs for wide character strings are
totally wrong"

Note also that the Changelog link for UUID goes to Utility, not UUID.

The code:

#include <boost/uuid/name_generator.hpp>
#include <boost/uuid/nil_generator.hpp>
#include <boost/uuid/uuid_io.hpp>
#include <iostream>

using namespace boost::uuids;
using namespace std;

int main()
{
   {
      cout << "WIDE" << endl;
      const wchar_t* a = L"one long string that is something like this and
that blahh";
      const wchar_t* b = L"hello there you long long string that looks
nothing like t";

      nil_generator nil;
      name_generator na(nil());
      name_generator nb(nil());

      uuid ua = na(a);
      uuid ub = nb(b);

      cout << to_string(ua) << endl;
      cout << to_string(ub) << endl;
   }

   {
      cout << "NARROW" << endl;
      const char* a = "one long string that is something like this and that
blahh";
      const char* b = "hello there you long long string that looks nothing
like t";

      nil_generator nil;
      name_generator na(nil());
      name_generator nb(nil());

      uuid ua = na(a);
      uuid ub = nb(b);

      cout << to_string(ua) << endl;
      cout << to_string(ub) << endl;
   }

   return 0;
}

the result:

$ g++ main.cpp && ./a.out
WIDE
4ffa48af-9685-5089-97ac-fe6627ead94c
4ffa48af-9685-5089-97ac-fe6627ead94c
NARROW
73030b72-a864-5c7b-9963-c0bedff1283e
da8943a6-26c9-5641-bd37-427b1b70d619
$

The two different wchar_t strings resolve to the same uuid !!!

What am I doing wrong?

thanks
Paul



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net