Debugging de aplicações em C e C++ Nuno Lopes, NEIIST – 7º Ciclo de Apresentações. 26/Abril/2007.

Slides:



Advertisements
Apresentações semelhantes
Chapter Five The Processor: Datapath and Control (Parte B: multiciclo)
Advertisements

Programação Orientada a Objetos*
Programação em Java Prof. Maurício Braga
Um programa em C Bibliotecas Variáveis globais
Funções em C.
Programação II Estruturas de Dados
Segurança em PHP Exemplos e Casos Práticos Nuno Lopes, NEIIST – 3º Ciclo de Apresentações. 17/Março/2005.
Segurança em aplicações Web Exemplos e Casos Práticos em Nuno Lopes, NEIIST – 7º Ciclo de Apresentações. 28/Março/2007.
Java: Comandos Básicos
Programando com Threads em C
Sincronização com Posix Threads
While While Condição // comandos End While. Exemplos While Var contador As Integer contador = 0 While (contador < 10) contador += 1 console.ConsoleWrite(contador)
Listas Encadeadas Circulares Listas Duplamente Encadeadas
Listas Encadeadas Circulares Listas Duplamente Encadeadas
Rodar Prolog2 no Unix Shell Conectar-se em limoeiro. Incluir /usr/local/prolog2/sys no seu path. Digitar prolog2 no prompt Unix. Digitar consult(" ").
Prof. José Fernando Rodrigues Júnior Pacotes Material original: Profa. Elaine Parros Machado de Sousa SCC Bancos de Dados e Suas Aplicações.
Procedimentos e Funções
Modificadores de tipos e Arquivos
A.4. Trabalhando com elementos de biblioteca STL – Standard Template Libraby Disponibiliza um conjunto de classes templates, provendo algoritmos eficientes.
Estruturas de Dados II Prof.: Sergio Pacheco Prof.: Sergio Pacheco 1 1.
Sistemas Operacionais
9 Controle de fluxo Seqüenciadores. Jumps. Escapes. Exceções.
7 Abstração Genérica Unidades genéricas e instanciação.
Grupo Paralelismo – Unesp RC
FORTRAN 90 Denise Yumi Takamura.
SQL Procedural Junho/2006.
SQL procedural – parte 2.
Buffer Overflow ou Stack Overrun ou Stack Smashing.
CES-41 COMPILADORES Capítulo IV Complementos de Análise Léxica.
CES-41 COMPILADORES Aulas Práticas
CES-10 INTRODUÇÃO À COMPUTAÇÃO Capítulo XI Noções de Estruturas de Dados.
CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo XI Encadeamento de Estruturas por Ponteiros.
Capítulo IX – Ponteiros 9.1 – Introdução 9.2 – Relação entre ponteiros e variáveis indexadas 9.3 – Alocação dinâmica de memória 9.4 – Variáveis indexadas,
ALOCAÇÃO DINÂMICA DE MEMÓRIA
Laboratório de Programação Prof. Oscar Luiz Monteiro de Farias
Laboratório de Programação Prof. Oscar Luiz Monteiro de Farias
Curso de Programação em C++ Universidade Federal do Ceará Departamento de Engenharia Estrutural e Construção Civil Prof: Evandro Parente Junior Monitor:
Universidade de Brasília
Slides Prof. Jean SIMÃO Revisão: Prof. João FABRO
Slides: Prof. SIMÃO Revisão: Prof. João Fabro
Slides: Prof. João Fabro UTFPR - Curitiba
Fundamentos de Programação 1
Tratamento de Ficheiros
A linguagem C#.
Revisão da Linguagem C.
Usando Java no Oracle Por Edson Almeida Junior
INPE / CAP-315 Airam J. Preto, Celso L. Mendes Aula 30 (1) Empacotamento de Dados em MPI Tópicos: Buffer de Mensagem Empacotamento/Desempacotamento.
HandyBoard & Interactive C. HandyBoard Especificações –Clock de 2 MHz –32 Kb de RAM –7 entradas para sensores analógicos –9 entradas para sensores digitais.
Estrutura de dados II Carlos Oberdan Rolim Ciência da Computação Sistemas de Informação.
Lecture 2 Properties of Fluids Units and Dimensions 1.
Monitoria GDI Aula Prática
Primeira aula de PL/SQL Parte II
How to Break Software Capítulo 3 Taíse Dias Testing from the user Interface.
RT-EXPERT Artis Corp. C calling program RTSUB [rule set subroutine] RTSUB [rule set subroutine] RTSUB [rule set subroutine]... DSL Decision Support Language.
Tipos Especiais de Listas
Aulas 2 e 3 – Java – Prof. Marcelo Heitor # O método main e argumentos na linha de comando; # Fluxo padrão de entrada e saída; # A classe JOptionPane;
Estruturas de Dados Aula 7: Tipos Estruturados 23/04/2014.
A linguagem C# Paulo Marques Departamento de Eng. Informática
Estruturas de Dados Aula 6: Cadeias de Caracteres
STRINGS Dilvan Moreira (baseado no livro Big Java e Z. Liang)
 2000 Prentice Hall, Inc. All rights reserved. 1 Capítulo 8 - Caracteres e Strings Sumário 8.1Introdução 8.2Conceitos Fundamentais de Strings e Caracteres.
© 2007 IBM Corporation Academic Initiative 07/05/07 Aula 2 – Parte 1: Java Basics Autores: Argemiro José de Juliano Marcos
Fundamentos de Programação 1 Slides 19 Prof. SIMÃO Jean Marcelo SIMÃO Linguagem C “Arquivos Binários”.
Fundamentos de Programação 1 Slides 21 Prof.ª Fabiany e Prof. SIMÃO Linguagem C “Lista Encadeada”.
Programação de Computadores I – Ponteiros
Fundamentos de Programação 1
Programação de Computadores I – Ponteiros
Linguagem C Linguagem Imperativa
Linguagem C Linguagem Imperativa
Pesquisadores envolvidos Recomenda-se Arial 20 ou Times New Roman 21.
Transcrição da apresentação:

Debugging de aplicações em C e C++ Nuno Lopes, NEIIST – 7º Ciclo de Apresentações. 26/Abril/2007

Agenda Erros/Warnings do compilador Bugs típicos Ferramentas úteis (GDB, Valgrind, et all) Casos Reais Questões

Agenda Erros/Warnings do compilador Bugs típicos Ferramentas úteis (GDB, Valgrind, et all) Casos Reais Questões

Erros/Warnings do compilador Detecção preventiva de bugs Mas... Compillar != Funcionar != Correcto Compiladores mais recentes detectam mais problemas gcc –O2 –Wall -g vs gcc –O0 –Wall -g

Exemplos format '%ld' expects type 'long int', but argument 3 has type 'size_t pointer targets in passing argument 1 of 'gdGetInt' differ in signedness 'php_safe_m' defined but not used

Exemplos implicit declaration of function 'php_gd_lex' return type defaults to 'int enumeration value 'PDO_FREE' not handled in switch value computed is not used

Agenda Erros/Warnings do compilador Bugs típicos Ferramentas úteis (GDB, Valgrind, et all) Casos Reais Questões

Double-free free(pointer) mais do que uma vez Origina crash na maioria das libcs char *ptr = malloc(sizeof(xpto));... if (error) { free(ptr);... }... free(ptr); *** glibc detected *** myApp: double free or corruption (fasttop): 0xdeadbeef ***

output do valgrind Invalid free() / delete / delete[] at 0x402142C: free (in /usr/.../vgpreload_memcheck.so) by 0x : main (test.c:6) Address 0x is 0 bytes inside a block of size 1 free'd at 0x402142C: free (in /usr/.../vgpreload_memcheck.so) by 0x80483FE: main (test.c:5)

Memory Leak Memória que é alocada não é devolvida char *ptr = malloc(sizeof(int));... if (error) { rollback_stuff(); return NULL; // não fez free }... free(ptr);

output do valgrind 4 bytes in 1 blocks are definitely lost in loss record 1 of 1 at 0x : malloc (in /usr/.../vgpreload_memcheck.so) by 0x80483E5: leak (memleak.c:5) by 0x804842B: main (memleak.c:18)

Buffer Overflow Escrever fora da área alocada char *strdup(const char *str) { char *copy = malloc(strlen(str)); char *tmp = copy; do { *tmp++ = *str; } while (*str++) return copy; }

output do valgrind Invalid write of size 1 at 0x804842D: strdup (in buffer-overflow.c:10) by 0x : main (in buffer-overflow.c:17) Address 0x416202C is 0 bytes after a block of size 4 alloc'd at 0x : malloc (in /usr/.../vgpreload_memcheck.so) by 0x804841A: strdup (in buffer-overflow.c:6) by 0x : main (in buffer-overflow.c:17)

Memória não inicializada Acesso a memória não inicializada. Pode induzir comportamentos aleatórios void readBuffer(void) { char *buffer = malloc(1024); if (/* cond */ 0) { strcpy(buffer, "ola"); } printf("%s\n", buffer); free(buffer); }

output do valgrind Conditional jump or move depends on uninitialised value(s) at 0x40226BB: strlen (in /usr/.../vgpreload_memcheck.so) by 0x408E834: puts (in /lib/libc-2.5.so) by 0x : readBuffer (mem-not-init.c:13) by 0x : main (mem-not-init.c:18)

Format strings printf("%s", str) vs printf(str) Erro de segurança (exploitável)

Dangling Pointers Ponteiros para regiões inválidas (stack ou heap) char* I_hate_pointers(void) { char buf[16]; *buf = '\0'; return buf; } main() { printf("%s", I_hate_pointers()); } dangling-pointers.c: In function 'I_hate_pointers': dangling-pointers.c:7: warning: function returns address of local variable

long vs int int != long != size_t nalgumas plataformas (e.g. 64 bits) void readBuffer(char *buf, long *read) { *read = 0xdeadead; } main() { char buf[10]; int x; readBuffer(buf, &x); } int-vs-long.c: In function 'main': int-vs-long.c:11: warning: passing argument 2 of 'readBuffer' from incompatible pointer type

Integer Overflow Cuidado com a aritmética modular.. char* alloc_img_buffer(int width, int height) { // 1 byte per pixel + 13 byte return malloc(width * height + 13); } int main() { // overflow... char *buffer = alloc_img_buffer( , 10); strcpy(buffer, "cabum!!!!!"); }

Integer Underflow Não assumir nada sobre o input void copy_skip_5(char *src, char *dest, size_t len) { len -= 5; memcpy(dest, src, len); } int main() { char src[]="oi"; char dest[10]; size_t len = strlen(src); // 2 copy_skip_5(src, dest, len); }

Signed vs Unsigned int table2[] = {50, 51, 52, 53}; int table[] = {1, 2, 3, 4, 5}; int lookup_char(char c) { return table[(int)c]; } int main() { int i = -5; if ((unsigned)i > 5) printf("why -5 > 5?\n"); printf("%d\n", lookup_char(0xFF)); // 53, why?? }

(des)Alinhamento de memória Certos tipos de dados têm que estar alinhados na memória Pouco relevante em x86 (excepto SSE) Em SPARC origina crashes (SIGBUS) void tricky_archs(void) { char buf[sizeof(double)]; double *n = (double*)buf; *n = 66.6; }

Agenda Erros/Warnings do compilador Bugs típicos Ferramentas úteis (GDB, Valgrind, et all) Casos Reais Questões

printf() O mais usado pelos novatos // a ordem de avaliação dos parâmetros é arbitrária printf("%d %d\n", systemcall, errno) printf("%d\n", systemcall); // aqui lemos o errno do printf em vez do errno da // syscall. usar perror() ajuda printf("%d\n", errno)

strace Lista system calls e respectivos argumentos -e trace=(file|process|network|signal|...) restringe system calls a interceptar

ltrace Lista chamadas a funções de bibliotecas dinâmicas (*.so), e.g. Libc Crasha com alguma frequência (especialmente com programas multi- threaded)

GDB # gdb./test (gdb) break strdup Breakpoint 1 at 0x80483fb: file prog.c, line 6. (gdb) run Starting program: /tmp/test Breakpoint 1, strdup (str=0x "xpto") at prog.c:6 6 char *copy = malloc(strlen(str)); (gdb) bt #0 strdup (str=0x "xpto") at prog.c:6 #1 0x a in main () at prog.c:17 (gdb) frame 1 #1 0x a in main () at prog.c:17 17 free(strdup("xpto"));

GDB (gdb) watch n Hardware watchpoint 2: n (gdb) continue Continuing. Hardware watchpoint 2: n Old value = (double *) 0x80495dc New value = (double *) 0xbfcedf1c tricky_archs () at unaligned-memory.c:88 *n = 66.6; (gdb) p n $1 = (double *) 0xbfcedf1c (gdb) step 9 return *n; (gdb) p *n $2 =

Comandos GDB break x – adiciona breakpoint bt – imprime backtrace step – salta para a próxima linha continue – salta até próximo breakpoint run - corre programa print x – imprime variável watch – adiciona watchpoint help – ajuda

valgrind Framework com múltiplas ferramentas: Callgrind – profiler Massif – heap profiler Helgrind – detector de race-conditions Memcheck – ferramenta mais usada. Detecta problemas de memória

Opções Valgrind/Memcheck --trace-children=yes --db-attach=yes – corre gdb quando encontra erro --leak-check=full – lista exaustiva de leaks --show-reachable=yes – lista de memória não liberta mas referenciada --track-fds=yes – listagem de FDs não fechados

Outras Ferramentas IBM Rational Purify – semelhante ao valgrind/memcheck, mas multi-plataforma Coverity – análise estática de código (incluindo problemas de segurança) Intel Thread Checker – debugger para problemas de multi-threading dtrace – debugger e profiler para Solaris

Agenda Erros/Warnings do compilador Bugs típicos Ferramentas úteis (GDB, Valgrind, et all) Casos Reais Questões

Signed char /php-src/ext/pdo/pdo_sql_parser.re Loop infinito com chars com valor > 127

Agenda Erros/Warnings do compilador Bugs típicos Ferramentas úteis (GDB, Valgrind, et all) Casos Reais Questões