RSS

C pitfalls

19 out

pitfall
Pitfall não é o GaMe HeHeHe 🙂

Quando falamos em “Pitfall“, falamos de uma analogia a armadilhas da
programação ou seja buracos , que quando se cai fica ruim de subir sem ajuda de
alguém , onde um programador iniciante pode errar e não conseguir ver onde está o erro.

Primeira dica use o argumento do GCC “-Wall” e “-Wextra“, vai te ajudar a ilustrar os erros mais comuns.

Segunda *Ler manuais para entender os protótipos isso ajuda
a entender melhor as funções, exemplo “man s snprintf”

Trap dos Sinais

*bom isso “==” é diferente disso “=”

“=” você usa para atribuição “x=2″,”if((Y=a+b)>X)”
“==” você usa para comparar se um valor for igual ao outro “if(x==y)”,”x=(a==b)?5:10;”

*isso “!=” é diferente disso ‘=!’
“!=” sinal de diferente para fazer comparação “if(x!=y)”
“=!” você seta uma var para NOT,if(x=(!y))

*confundir ponteiros com operador aritmético de produto “*”
invés de fazer x=2**pointer;
faça x=2*(*pointer);
isso evita comentários indesejados caso aja operador de divisão “/”

*esquecer de botar “;” no final de cada linha é um erro comum e fácil
de detectar

*setar errado variáveis na declaração pode dar dor de cabeça
invés de fazer “int x=3,y,z=1,c=314;”
faça “int x=3,z=1,c=314” e “int y” ou “int x,z,c,y” depois setar valores…
Exemplo comum de trap em chars

char letra = 'A';             // certo 
char letra = "A";             // errado   
const char * word = "A";     // certo
const char * word = 'A';     // errado

Problemas de Casting

*Erros de “Casting” tentar armazenar uma variável float
em Int sem converter ou Double invés de float…

5 exemplos de casting

//1
  int index = 1;
  float var = 0.0;
  index = (int)var;
//2
  char c = ’A’;   
  int x = (int)c;
//3
  int x;
//printando de "A" até "Z"
  for(x=97; x<=122; x++)
   printf(" %c ", (char)x);
//4
int x=7, y=5;
float z;
z = (float)x/(float)y;  
//5
int x = 13;
printf("x/2 is %f", (float)x / 2);

Problemas em Leituras de variáveis “STDIN”

Maioria do pessoal que começa em C comete este erro veja só
o exemplo do “scanf()”

 int x;
 char *palavra=malloc(8*sizeof(char));

 scanf("%d",&x);
// quando é string não usa "&"
 scanf("%s",&palavra);
 puts(palavra);
 printf("%d \n",x);
 free(palavra);

A o uso do operador “&” no “scanf()” quando trabalhamos com string
nos trás erro, outro problema comum é o bug do “newline”, ao teclarmos
“enter” no final de um “STDIN” no final da string fica “\n” alguns
casos ocorre um “jump” pelo código e alguns outros erros estranhos,
alguns usam “getchar()” para evitar, outros criam uma função ou macro

eu costumo usar ReadString, vou mostrar minha
macro e uma função do meu amigo m0nad

// minha macro para remover o '\n'
#define ReadString(a) fgets(a,sizeof(a),stdin),a[strlen(a)-1] = '\0'; 
 
//func fo m0nad
void
chomp (char * str)
{
  while (*str) {
    if (*str == '\n' || *str == '\r') {
      *str = 0;
      return;
    }
    str++;
  }
}

// ex de uso dump_line(stdin);
void dump_line( FILE * fp )
{
  int ch;
  while( (ch = fgetc(fp)) != EOF && ch != '\n' )
}

Sempre bom validar entradas “STDIN” para
ter um controle maior e melhorar segurança do seu programa, procurar usar
strncpy() invés de strcpy(), strncmp(),snprintf() e outras funções mais seguras, principalmente ao nidar com “argv” vide ataques de Buffer Overflow e format string.

*Pthread e o Lock com Mutex
Parece ser dica para ganhar desempenho , mais muitos acabam ganhando
dor de cabeça em não implementar , bom invés de

 pthread_mutex_lock(&count_lock); 
   temp = sqrt(x); 
   fd = open(fname, O_CREAT | O_RDWR, 0666); 
   count++; 
   *bufp = (char *)malloc(256); 
 pthread_mutex_unlock(&count_lock); 

faça

  temp = sqrt(x); 
  fd = open(fname, O_CREAT | O_RDWR, 0666); 
  pthread_mutex_lock(&count_lock); 
   count++; 
  pthread_mutex_unlock(&count_lock); 
  *bufp = (char *)malloc(256); 

trancar apenas o que for necessário, quando falamos de mutex

*Problemas na HEAP

Para evitar *Memory leaks sempre que usar a HEAP usar free(),
com “malloc()” dê “free(var)” para dar clear na HEAP, para verificar
se tem memory leaks no seu código use o valgrind.
Outra dica é usar alloca() já que é baseada em Stack invés de Heap,
mas tem um certo problema para depuração…
DMR ,Linus coment about alloca()

exemplo de uso do free()

#include <malloc.h>
#include <unistd.h>

int main()
{
 char *x=malloc(3*sizeof(char));

 x[0]='o';
 x[1]='l';
 x[2]='a';

 write(1,x,3);
 write(1,"\n",2);

 free(x);

 return 0;
}

Ao tirar o “free()” e passar o valgrind veja o que se passa

cooler@lisperian:~/c/pitfall$ valgrind ./a
==12647== Memcheck, a memory error detector
==12647== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
==12647== Using Valgrind-3.6.1-Debian and LibVEX; rerun with -h for copyright info
==12647== Command: ./a
==12647==
ola
==12647==
==12647== HEAP SUMMARY:
==12647== in use at exit: 3 bytes in 1 blocks
==12647== total heap usage: 1 allocs, 0 frees, 3 bytes allocated
==12647==
==12647== LEAK SUMMARY:
==12647== definitely lost: 3 bytes in 1 blocks
==12647== indirectly lost: 0 bytes in 0 blocks
==12647== possibly lost: 0 bytes in 0 blocks
==12647== still reachable: 0 bytes in 0 blocks
==12647== suppressed: 0 bytes in 0 blocks
==12647== Rerun with --leak-check=full to see details of leaked memory
==12647==
==12647== For counts of detected and suppressed errors, rerun with: -v
==12647== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 11 from 6)

Veja que foi alocado e nada foi liberado na memória , use “free()”
caso não esteja convencido leia este paper da phrack clicando AQUI

O poderoso GDB

Quando você vê que nem você e nem seus amigos programadores acham o erro
então é hora de apelar para o GDB, sugestão para aprender usar GDB, paper
do mestre stallman

gnu gdb book

No desespero irc.freenode.net
canais #gdb,#c-br,#asm

espero ter ajudado 😉

Anúncios
 
2 Comentários

Publicado por em outubro 19, 2011 em Linguagem C, segurança de sistemas

 

2 Respostas para “C pitfalls

  1. s0n1csnp

    outubro 31, 2011 at 2:20 am

    EXCELENTE, bom que to começando ainda, ai isso já ajuda muito, apesar de ter algumas coisas ae que não cheguei a estudar, mas bom que já fico ligado…

    De qualquer forma, obrigado 😀

    Abraços…

     

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

 
%d blogueiros gostam disto: