elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado: Únete al Grupo Steam elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  Error con una variable dentro de una clase con herencia
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Error con una variable dentro de una clase con herencia  (Leído 1,548 veces)
Thaorius


Desconectado Desconectado

Mensajes: 1.072


Ver Perfil WWW
Error con una variable dentro de una clase con herencia
« en: 2 Septiembre 2006, 23:56 »

Hola, bueno, tengo una pequeña clase para manejar los errores dentro de mi proyecto. El problema es que cuando llamo a SetErrorState el programa colapsa haciendo aparecer el tipico cartel de windows de enviar, no enviar.

El de pupurador del Dev-C++ me dice que hay una violacion de un acceso a memoria(fallo de segmentacion).

La clase es esta:
Código:
//================================================================================
//
// This file is part of the Teox Machete Framework.
// Copyright 2006 - Teox Develpment Team.
//
// You can redistribute this file or any part of it but you have to say that
// it is part of the Teox Machete Framework.
//
//================================================================================

#ifndef __ERRORBASE_H__
#define __ERRORBASE_H__

class ErrorBase
{
public:
  ErrorBase( void ) { bError = false; }
  ~ErrorBase( void ) {}
 
  bool GetErrorState( void ) { return bError; }
  const char *GetLastError( void ) { return szError; }

protected:
      void SetErrorState( const char *szErrorMessage ) { szError = szErrorMessage; bError = true;}
      void ClearErrorState( void ) { bError = false; }

private:     
      bool bError;
      const char *szError;
};

#endif

Gracias por la ayuda.

Un saludo


En línea

Si te sirvio mi aporte, encontrarás más en www.teoxstudios.com. Gracias!
Buscando un buen hosting? Click aquí
dcordero

Desconectado Desconectado

Mensajes: 33


Ver Perfil
Re: Error con una variable dentro de una clase con herencia
« Respuesta #1 en: 3 Septiembre 2006, 01:02 »

Yo creo que el problema esta en:
szError = szErrorMessage;

Con eso se hace que el puntero szError apunte al mismo sitio que el puntero szErrorMessage que se recibe por parametros.

Seguramente el puntero szErrorMessage haga mas cosas tras llamar a la funcion, con lo cual se esta cambiando indirectamente szError ya que esta en la misma zona de memoria.

Prueba a cambiarlo por un:
strcpy (szError, szErrorMessage);

Y me cuentas que tal...


En línea

Thaorius


Desconectado Desconectado

Mensajes: 1.072


Ver Perfil WWW
Re: Error con una variable dentro de una clase con herencia
« Respuesta #2 en: 3 Septiembre 2006, 08:45 »

Por un lado, le paso una cadena entre "" a la funcion, para ser preciso:
SetErrorState("Can't open input file");
Por lo que no puede ser modificada szErrorMessage, pero =, aunco nel strcpy() sigue colapsando.

Alguna otra idea?

Saludos
En línea

Si te sirvio mi aporte, encontrarás más en www.teoxstudios.com. Gracias!
Buscando un buen hosting? Click aquí
jose2c

Desconectado Desconectado

Mensajes: 204


Ver Perfil
Re: Error con una variable dentro de una clase con herencia
« Respuesta #3 en: 3 Septiembre 2006, 13:47 »

coloca un poco mas de código, donde uses la clase.
En línea

Thaorius


Desconectado Desconectado

Mensajes: 1.072


Ver Perfil WWW
Re: Error con una variable dentro de una clase con herencia
« Respuesta #4 en: 3 Septiembre 2006, 20:05 »

Funcion que la usa:

Código:
bool Machete::Crypto::XOR::EncodeFile( const char *szInput, const char *szOutput, XORKey mKey )
{
     ifstream mStream;
     ofstream mOStream;

     mStream.open(szInput, ios_base::binary | ios_base::in | ios_base::ate );
     mOStream.open(szOutput, ios_base::binary | ios_base::out | ios_base::trunc );
     
     if(!mStream.is_open()) {cout << "SetErrorState()" << endl;
     SetErrorState("Can't open input file.");
     cout << "Status: OK" << endl;
     return false;
}
     
     if(!mOStream.is_open()) {
     SetErrorState("Can't open input file.");
     return false;
}

     char *szBuffer;
     bool go = true;
     int size = mStream.tellg();
     mStream.seekg(0, ios_base::beg);

     while(go)
     {
       szBuffer = new char[4096];
       
       if(size >= mKey.Size)
       {
             size -= mKey.Size;
mStream.read(szBuffer, mKey.Size);
mKey.Bytes = mKey.Size;
mOStream.write(EncodeString(szBuffer, mKey), mKey.Size);
} else {
  XORFixedKey mKey2;
  mKey2.Size = size;
  mKey2.Key = mKey.Key;
  mKey2.Bytes = size;
       mStream.read(szBuffer, mKey.Size);
       mOStream.write(EncodeFixedString(szBuffer, mKey2), size);
       go = false;
  }
}

mOStream.close();
mStream.close();
return true;
}

Declaracion de clase, en XOR.h
Código:
#ifndef __XOR_H__
#define __XOR_H__

#if BUILDING_DLL
# define CRYPTO_EXP __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define CRYPTO_EXP __declspec (dllimport)
#endif /* Not BUILDING_DLL */

#include <iostream>
#include <fstream>
#include "ErrorBase.h"

#define MAX_SIZE 12000

using namespace std;

namespace Machete {
namespace Crypto {

enum XORSize
{
     XOR_8 = 1,
     XOR_16 = 2,
     XOR_32 = 4,
     XOR_64 = 8,
     XOR_128 = 16,
     XOR_256 = 32,
};

struct XORKey
{
     XORSize Size;
     const char *Key;
     int Bytes;
};

struct XORFixedKey
{
     int Size;
     const char *Key;
     int Bytes;
};

class CRYPTO_EXP XOR : public ErrorBase
{
public:
  XOR( void ) {};
  ~XOR( void ) {};
 
  const char *EncodeString( const char *szString, XORKey mKey );
  const char *EncodeString( const char *szString, const char *szKey, XORSize nSize, int Bytes );
  const char *EncodeFixedString( const char *szString, XORFixedKey mKey );
  bool EncodeFile( const char *szInput, const char *szOutput, XORKey mKey );
  bool EncodeFile( const char *szInput, const char *szOutput, const char *szKey, XORSize nSize );
};

}
}

#endif

Saludos y gracias
En línea

Si te sirvio mi aporte, encontrarás más en www.teoxstudios.com. Gracias!
Buscando un buen hosting? Click aquí
jose2c

Desconectado Desconectado

Mensajes: 204


Ver Perfil
Re: Error con una variable dentro de una clase con herencia
« Respuesta #5 en: 4 Septiembre 2006, 06:12 »

Tengo una idea de cual pueda ser el problema, a ver si me explico:

supon que en lugar de esto:
Código:
SetErrorState("Can't open input file.");

haces esto:
Código:
char *aux="Can't open input file.";
SetErrorState(aux);

Yo pienso que el error en acceso a memoria se debe a lo siguiente: el metodo SetErrorState (en la suposicion) hace que szError (char * privado) apunte a la misma direccion que apunta aux (char * publico). Entonces si mas adelante se hiciere una modificacion a aux afectaria tambien a szError, y se supone que szErrores privado, por lo que no deberia poder ser modificado mas que por la misma clase. Por eso (pienso) q se da el error. Prueba declarar szError publico o bien dale su direccion de memoria propia, algo asi:
Código:
void SetErrorState( const char *szErrorMessage ){
szError = new char[strlen(szErrorMessage )];
strcpy(szError,szErrorMessage);
}

puede que sea un disparate pero fue lo unico que se me ocurrio.
En línea

Thaorius


Desconectado Desconectado

Mensajes: 1.072


Ver Perfil WWW
Re: Error con una variable dentro de una clase con herencia
« Respuesta #6 en: 4 Septiembre 2006, 16:59 »

Ya lo resolvi, fue culpa mia, le hice un par de cambios pero no compile de neuvo las 3 dll's, solo 1, en consecuencia Machete.dll interferia de alguna forma en el funcionamiento, recompile todo y ahora anda de perlas xD

Saludos y gracias =.
En línea

Si te sirvio mi aporte, encontrarás más en www.teoxstudios.com. Gracias!
Buscando un buen hosting? Click aquí
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines