• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

matine206

duvidas urgentes c++ d exame

15 mensagens neste tópico

exponho aqui 2 exercicios d exame diferentes e espero vossa ajuda

Exercicio 1 --Considerando o seguinte codigo, comente a frase " O c++ não assegura completamente o encapsulamento!"

class target_class{

friend class friend_class;

private:

double salary;

int rating;

};

target_class classA;

int main () {

char *p = (char *) &classA;

classA.rating=5;

int *pd = (int*) (p+sizeof(double));

*pd = 5;

return 0;

}

exercicio2 Considerando o seguinte codigo em c++, explique os eventuais problemas de performance existentes, e apresente as respectivas soluções

class Pessoa {

private:

std::string nome;

std::string morada;

public:

Pessoa();

virtual ~Pessoa();

//..

};

class Aluno: public Pessoa {

private:

std::string nomeEscola;

std::string moradaEscola;

public:

Aluno();

~Aluno();

//...

};

int main ( int argc, char** argv) {

//...

bool validaAluno (Aluno s);

Aluno fourrier;

bool fourrierIsOK = validaAluno(fourrier);

//...

}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Conselhos:

1º Usa indentação no código

2º Usa as tags [ code=c++] [ /code] (sem os espaços) de forma a tornar mais perceptível e agradável aos olhos

3º E não menos importante, como deves calcular, ninguém vai resolver os problemas por ti, quais são exactamente as tuas dúvidas nesses dois exercícios?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ok... so ke me ajudassem a identificar os eventuais nos codgigos ja seria bom para mim

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

porque nao vais por partes.. por exemplo no 1º exercicio.. procuras o que é encapsulamento.. eu ao pesquisar por isso rapidamente obtive uma resposta..

-- www.google.pt

-- pesquisas por. encapsulamento + c++

e entre muitos links encontras isto:

http://pt.wikipedia.org/wiki/C%2B%2B

procuras onde esta a explicar o que é o encapsulamento e tentas relacionar o que lá diz com o que o programa faz..

PS: Aqui o pessoal nao faz trabalhos, tira duvidas e ajuda ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

boas,

Isto tudo para crakear o encapsulamento.

Não consegui entender foi para que servia p?

O seguinte código char* p = (char*) &ClassA;, é um cast, mas vai devolver o que? já fiz o debug mas não consigo entender.

cumprimentos,

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ClassA ==> objecto de tipo target_class

&ClassA ==> endereço de um objecto de tipo target_class

(char*)&ClassA ==> endereço para valores de tipo char

char* p ==> apontador para valores de tipo char

char* p = (char*)&ClassA; ==> mete p a apontar para o primeiro char do objecto ClassA

Agora é possível ver a representação do objecto ClassA usando caracteres.

(char*)p = (char*)&ClassA;
for (i=0; i<sizeof ClassA; i++, p++) {
  printf("%d: %02x\n", i, *p);
}

Mas o interesse de fazer isto é discutível :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu diria que serve para provar o que é dito relativamente ao encapsulamento em C++. Passas a conseguir aceder a todos os membros do objecto sem a protecção eventualmente oferecida pela classe.

Possivelmente resultará num warning do compilador.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sendo assim

com classA.rating=5; não conseguimos aceder a rating, mas com

char* p = (char*)&ClassA; ==> mete p a apontar para o primeiro char do objecto ClassA

int *pd = (int*) (p+sizeof(double));
*pd = 5; 

estando p a apontar para o primeiro char do objecto classA e dando-lhe, mais espaço do que o que precisa (double), fica com espaço para ser alterado, dado que o espaço protegido é de um int?

cumprimentos

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não é bem isso.

Ao alocares espaço para um objecto da target_class, ficas com o seguinte espaço alocado:

|____.____.____.____.____.____.____.____|____.____.____.____|

            8B : campo salary          4B : campo rating

porque (normalmente) o tamanho do double é 8 bytes e o tamanho do int é 4 bytes. Ao fazeres char* p = (char*) &ClassA; ficas com um apontador para byte a apontar para o 1º byte do objecto, ou seja

p

|

V

|____.____.____.____.____.____.____.____|____.____.____.____|

            8B : campo salary          4B : campo rating

Depois, ao fazeres int *pd = (int*) (p+sizeof(double)); estás a dizer que pd vai ficar a apontar para 8 bytes (porque sizeof(double) = 8 ) à frente de p, ou seja:

p                                  pd = p+8

|                                      |

V p+1  p+2  p+3  p+4  p+5  p+6  p+7  V

|____.____.____.____.____.____.____.____|____.____.____.____|

            8B : campo salary          4B : campo rating

Como pd é um apontador para int, e no endereço para onde pd aponta foi declarada uma variável do tipo int, podes escrever em (*pd) para afectar o compo rating.

Nota:

| é uma seta a apontar para baixo :P

V

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

boa explicação  :P, quer dizer que no preposito que poderia servir este código (crakear) o programador tinha que "adivinhar" que a variável que ele queria estava a seguir a 8b (double), se no encapsulamento  tivesse mais 8b antes de chegar ao atributo que pretendia-mos daria erro.

Para resolver essa situação teria-mos que acrescentar +sizeof(double), correcto?

int *pd = (int*) (p+sizeof(double)+sizeof(double));
*pd = 5; 

cumprimentos

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

As técnicas de cracking normalmente não seguem esta via, porque alteram directamente o código. Em hacking também não é a mais usual, porque normalmente não se tem acesso ao código fonte e não sabe que está ali uma estrutura ou uma classe. Procura-se por um valor e acede-se directamente ao seu endereço de memória.

A utilidade seria mais ao nível de teres uma biblioteca estática pré-compilada, quereres mudar um valor privado do objecto, mas não quereres seguir os mecanismos de encapsulamento da classe, seja por razões de performance, ou de pura teimosia :P

Se soubesses que tinhas uma classe definida da seguinte forma:

class C {
    int i1, i2;
    double d1, d2;
    char c;
}

C cl;

e por exemplo quisesses obter apontadores para os campos d2 e c, era necessário fazer

char *pcl = (char *)&cl; //este passo não era necessário, bastava utilizar directamente ((char *)(&cl)) onde se vai utilizar pcl, mas fica mais legível desta forma
double *pd2 = (double *)(pcl + /* i1 */ sizeof(int) + /* i2 */ sizeof(int) + /* d1 */ sizeof(double));
char *pc = (char *)(pcl + /* i1 */ sizeof(int) + /* i2 */ sizeof(int) + /* d1 */ sizeof(double) + /* d2 */ sizeof(double));
// ou
// char *pc = (char *)(pd2 + /* d2 */ sizeof(double));

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso é uma pergunta?

// comentário de uma linha. Tudo o que estiver à frente das duas barras é um comentário

/* comentário multi-linha.
   é tudo comentário desde o "barra-asterisco"
   até ao "asterisco-barra" */

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora