Почему я получаю эту ошибку сегментации на Solaris?

Итак, начнем с того, что этот код работает на всех моих машинах с RedHat и некоторых других машинах Solaris. Машина, которая производит ошибку, является битом Solaris 64. Код у меня следующий:

Это класс frUUID:

  frUUID::frUUID()
  {}

  std::string frUUID::genUUID()
  {
    char uuidBuff[36];
    uuid_t uuidGenerated;
    uuid_generate_random(uuidGenerated);
    uuid_unparse(uuidGenerated, uuidBuff);

    std::cout << uuidBuff << std::endl; // prints out a correct uuid

    return std::string(uuidBuff);
  }

Затем в модульном тесте у меня есть:

 frUUID uuids;

 std::string uuid1 = uuids.genUUID();
 std::cout << std::endl << "UUID 1: " << uuid1 << std::endl; 
 //This cout produces the seg fault on the uuid1

Я понятия не имею, что здесь происходит, все кажется правильным? У кого-нибудь есть идеи?


person Grammin    schedule 15.08.2011    source источник


Ответы (3)


Вы не оставляете места для завершающего нулевого байта в uuidBuff.

person hmakholm left over Monica    schedule 15.08.2011

На странице руководства uuid_unparse:

Функция uuid_unparse преобразует предоставленный UUID uu из внутреннего двоичного формата в 36-байтовую строку (плюс завершающий символ '\0').

Ваш буфер слишком мал для этого. Вы находитесь на территории неопределенного поведения.

person Mat    schedule 15.08.2011
comment
Спасибо, мои головы кружились вокруг этого часами, я не могу поверить, что пропустил это. - person Grammin; 15.08.2011

сдача

char uuidBuff[36];

to

char uuidBuff[37];

для нулевого символа

person Ed Heal    schedule 15.08.2011