I recently shot myself in the foot using the following BroString constructor:
BroString::BroString(int arg_final_NUL, byte_vec str, int arg_n)
b = str;
n = arg_n;
final_NUL = arg_final_NUL;
use_free_to_delete = 0;
I didn't realize that when creating a new BroString, the byte_vec I pass in doesn't get copied. I was using the byte_vec I was passing in further down, and couldn't understand why BroString wasn't acting properly. (byte_vec is defined as u_char*, not as a constant).
BroString::Set uses memcpy to copy the string. The other constructors all seem to use BroString::Set.
BroString::BroString(const u_char* str, int arg_n, int add_NUL)
Set(str, arg_n, add_NUL);
BroString::BroString(const char* str)
BroString::BroString(const string &str)
The behavior is inconsistent at best. Personally, when I create a new string object, I'd expect the data to be copied, but I could see a few special cases where you might want to avoid that for performance reasons.
Any thoughts on this? Is this intended behavior? I suspect that any changes to BroString would require a lot of changes downstream.