A
Andy
Hi, all
I wrote a simple program. It runs okay with g++ 3.2.2, g++4.0. However,
it
does not execute correctly with gcc-3.4.2. gcc-3.4.3. Could you help me
to check if
this program is buggy?
// header file
#ifndef _MC_STATE_H_
#define _MC_STATE_H_
#include <sys/types.h>
#include <cstring>
#include <cstdlib>
#include <string>
using namespace std;
class Signature
{
public:
Signature(unsigned char * str, size_t len);
Signature(const Signature& nsig);
~Signature();
Signature operator =(Signature osig);
string to_string();
private:
unsigned char * sig;
size_t len;
};
class State
{
public:
State();
State(const void*, int len);
State(const State&);
~State() throw ();
State& operator = (State&);
bool operator == (State&);
bool operator == (State);
bool operator != (State&);
Signature get_signature();
State operator + (State&);
private:
unsigned char * data;
size_t sz;
bool valid_sig;
unsigned char sig[16];
};
#endif
// the main program
#include <sys/types.h>
#include <cstring>
#include <cstdlib>
#include <openssl/md4.h>
#include "state.hh"
#include <cassert>
using namespace std;
Signature::Signature(unsigned char* str, size_t vlen)
{
sig = new unsigned char[len];
len = vlen;
memcpy(sig, str, len);
}
Signature::Signature(const Signature& nsig)
: len(nsig.len)
{
sig = new unsigned char [len];
memcpy(sig, nsig.sig, len);
}
Signature::~Signature()
{
delete[] sig;
}
Signature Signature:
perator = (Signature osig)
{
delete[] sig;
len = osig.len;
sig = new unsigned char [len];
memcpy(sig, osig.sig, len);
return *this;
}
string Signature::to_string()
{
char* buf;
int i;
buf = new char[len * 2+1];
for (i = 0; i < len; i++) sprintf(buf+2*i, "%x", sig);
buf[len*2] = 0;
string retval = string(buf);
return retval;
}
/*****************************************************************************/
State::State()
: data(0), sz(0), valid_sig(false)
{}
State::State(const void * dt, int len)
: valid_sig(false), sz(len)
{
data = new unsigned char [len];
memcpy(data, dt, sz);
}
State::State(const State& nst)
: valid_sig(nst.valid_sig), sz(nst.sz)
{
data = new unsigned char[sz];
memcpy(data, nst.data, sz);
memcpy(sig, nst.sig, sizeof(sig));
}
State::~State() throw()
{
delete [] data;
}
State& State:
perator = (State& nst)
{
if (data != 0) delete reinterpret_cast<char*>(data);
sz = nst.sz;
valid_sig = nst.valid_sig;
data = new unsigned char[sz];
memcpy(data, nst.data, sz);
if (valid_sig) memcpy(sig, nst.sig, sizeof(sig));
return *this;
}
bool State:
perator == (State & nst)
{
if (sz != nst.sz) return false;
return (memcmp(data, nst.data, sz) == 0);
}
bool State:
perator == (State nst)
{
if (sz != nst.sz) return false;
return (memcmp(data, nst.data, sz) == 0);
}
bool State:
perator != (State & nst)
{
if (sz != nst.sz) return true;
return (memcmp(data, nst.data, sz) != 0);
}
Signature State::get_signature()
{
if (sz <= 16)
return Signature(data,sz);
MD4(data, sz, sig);
return Signature(sig, sizeof(sig));
}
State State:
perator + (State& nst)
{
State retval;
retval.data = new unsigned char [this->sz + nst.sz];
retval.sz = this->sz + nst.sz;
retval.valid_sig = false;
memcpy(retval.data, data, sz);
memcpy(retval.data + sz, nst.data, nst.sz);
assert(retval.sz == this->sz + nst.sz);
return retval;
}
#if 1
#include <iostream>
using namespace std;
int main()
{
char data[] =
"fdfdsafdsafhasdkhfksladhfklsdahfklsdahflksdahfdsahkfkasd";
State st(data, sizeof(data));
cout<<st.get_signature().to_string()<<endl;
char data2[] = "abcd";
State st2(data2, sizeof(data2));
cout<<st2.get_signature().to_string()<<endl;
State st3 = st + st2;
cout<<st3.get_signature().to_string() <<endl;
}
#endif
This program is compile with " g++ file_name.cc -lcrypto"
Thanks!
Andy
I wrote a simple program. It runs okay with g++ 3.2.2, g++4.0. However,
it
does not execute correctly with gcc-3.4.2. gcc-3.4.3. Could you help me
to check if
this program is buggy?
// header file
#ifndef _MC_STATE_H_
#define _MC_STATE_H_
#include <sys/types.h>
#include <cstring>
#include <cstdlib>
#include <string>
using namespace std;
class Signature
{
public:
Signature(unsigned char * str, size_t len);
Signature(const Signature& nsig);
~Signature();
Signature operator =(Signature osig);
string to_string();
private:
unsigned char * sig;
size_t len;
};
class State
{
public:
State();
State(const void*, int len);
State(const State&);
~State() throw ();
State& operator = (State&);
bool operator == (State&);
bool operator == (State);
bool operator != (State&);
Signature get_signature();
State operator + (State&);
private:
unsigned char * data;
size_t sz;
bool valid_sig;
unsigned char sig[16];
};
#endif
// the main program
#include <sys/types.h>
#include <cstring>
#include <cstdlib>
#include <openssl/md4.h>
#include "state.hh"
#include <cassert>
using namespace std;
Signature::Signature(unsigned char* str, size_t vlen)
{
sig = new unsigned char[len];
len = vlen;
memcpy(sig, str, len);
}
Signature::Signature(const Signature& nsig)
: len(nsig.len)
{
sig = new unsigned char [len];
memcpy(sig, nsig.sig, len);
}
Signature::~Signature()
{
delete[] sig;
}
Signature Signature:
{
delete[] sig;
len = osig.len;
sig = new unsigned char [len];
memcpy(sig, osig.sig, len);
return *this;
}
string Signature::to_string()
{
char* buf;
int i;
buf = new char[len * 2+1];
for (i = 0; i < len; i++) sprintf(buf+2*i, "%x", sig);
buf[len*2] = 0;
string retval = string(buf);
return retval;
}
/*****************************************************************************/
State::State()
: data(0), sz(0), valid_sig(false)
{}
State::State(const void * dt, int len)
: valid_sig(false), sz(len)
{
data = new unsigned char [len];
memcpy(data, dt, sz);
}
State::State(const State& nst)
: valid_sig(nst.valid_sig), sz(nst.sz)
{
data = new unsigned char[sz];
memcpy(data, nst.data, sz);
memcpy(sig, nst.sig, sizeof(sig));
}
State::~State() throw()
{
delete [] data;
}
State& State:
{
if (data != 0) delete reinterpret_cast<char*>(data);
sz = nst.sz;
valid_sig = nst.valid_sig;
data = new unsigned char[sz];
memcpy(data, nst.data, sz);
if (valid_sig) memcpy(sig, nst.sig, sizeof(sig));
return *this;
}
bool State:
{
if (sz != nst.sz) return false;
return (memcmp(data, nst.data, sz) == 0);
}
bool State:
{
if (sz != nst.sz) return false;
return (memcmp(data, nst.data, sz) == 0);
}
bool State:
{
if (sz != nst.sz) return true;
return (memcmp(data, nst.data, sz) != 0);
}
Signature State::get_signature()
{
if (sz <= 16)
return Signature(data,sz);
MD4(data, sz, sig);
return Signature(sig, sizeof(sig));
}
State State:
{
State retval;
retval.data = new unsigned char [this->sz + nst.sz];
retval.sz = this->sz + nst.sz;
retval.valid_sig = false;
memcpy(retval.data, data, sz);
memcpy(retval.data + sz, nst.data, nst.sz);
assert(retval.sz == this->sz + nst.sz);
return retval;
}
#if 1
#include <iostream>
using namespace std;
int main()
{
char data[] =
"fdfdsafdsafhasdkhfksladhfklsdahfklsdahflksdahfdsahkfkasd";
State st(data, sizeof(data));
cout<<st.get_signature().to_string()<<endl;
char data2[] = "abcd";
State st2(data2, sizeof(data2));
cout<<st2.get_signature().to_string()<<endl;
State st3 = st + st2;
cout<<st3.get_signature().to_string() <<endl;
}
#endif
This program is compile with " g++ file_name.cc -lcrypto"
Thanks!
Andy