Hi Jeff,

Your code is exactly what I had before. But I was getting that heap error. 
It only went away when I used NEW. I have never seen that before. I also 
don't like using NEW at all but it wasn't working. 

On Wednesday, April 26, 2023 at 11:21:46 PM UTC-4 Jeffrey Walton wrote:

> On Wed, Apr 26, 2023 at 11:16 PM Jeffrey Walton <nolo...@gmail.com> wrote:
> >
> > On Wed, Apr 26, 2023 at 6:13 PM Dwight Kulkarni <dwi...@realtime-7.com> 
> wrote:
> > >
> > > I ran address sanitizer: Heap use after free is the problem. I had to 
> use the NEW operator to allocate the ram. What is weird is that usually it 
> will error out right away after it goes out of scope, but this was delayed 
> in recovering the memory, so it was working and then poof the memory 
> disappears, but there is no access violation, it just returns bad result 
> but only sometimes. Other times it is working and if there is a delay then 
> the RAM gets reclaimed in that time and the error occurs right in the 
> middle of the function. Really freaky.
> > >
> > > char* convert_cryptopp_integer_str(Integer n, size_t& msg_len){
> > > const size_t len = n.MinEncodedSize(Integer::UNSIGNED);
> > > char* v = new char[len];
> > > msg_len = len;
> > > n.Encode((byte*)v, len, Integer::UNSIGNED);
> > > return v;
> > > }
> > >
> > > std::vector<byte>* convert_cryptopp_integer(Integer n){
> > > const size_t len = n.MinEncodedSize(Integer::UNSIGNED);
> > > std::vector<byte>* v = new std::vector<byte>(len);
> > > n.Encode((byte*)v, v->size(), Integer::UNSIGNED);
> > > return v;
> > > }
> >
> > So C-ish... Stop managing allocations with new and free. Let the std
> > C++ library do the work for you:
> >
> > std::string convert_cryptopp_integer_str(const CryptoPP::Integer& n)
> > {
> > using namespace CryptoPP;
> >
> > const size_t len = n.MinEncodedSize(Integer::UNSIGNED);
> > std::string v;
> > v.resize(len);
> >
> > n.Encode((byte*)&v[0], v.size(), Integer::UNSIGNED);
> > return v;
> >
> > }
> >
> > std::vector<CryptoPP::byte> convert_cryptopp_integer(const 
> CryptoPP::Integer& n)
> > {
> > using namespace CryptoPP;
> >
> > const size_t len = n.MinEncodedSize(Integer::UNSIGNED);
> > std::vector<byte> v(len);
> >
> > n.Encode((byte*)&v[len], v.size(), Integer::UNSIGNED);
> > return v;
> > }
>
> I probably should have said... This is the _portable_ way to get the
> non-const pointer to the first element in the array:
>
> n.Encode((byte*)&v[0], v.size(), Integer::UNSIGNED);
>
> It is portable because it works with C++98 and above. Other methods
> exist, but they work with C++11 and above.
>
> This was wrong. It should have used element 0, not element 'len':
>
> n.Encode((byte*)&v[len], v.size(), Integer::UNSIGNED);
>
> Jeff
>

-- 
You received this message because you are subscribed to the Google Groups 
"Crypto++ Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to cryptopp-users+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/cryptopp-users/eea0b651-b625-4cd6-becf-0308f6cc0efan%40googlegroups.com.

Reply via email to