Desenvolvimento para Sistemas Embarcados (CEA 513) Codificação Segura para Embarcados

Tamanho: px
Começar a partir da página:

Download "Desenvolvimento para Sistemas Embarcados (CEA 513) Codificação Segura para Embarcados"

Transcrição

1 Universidade Federal de Ouro Preto Departamento de Computação e Sistemas - DECSI Desenvolvimento para Sistemas Embarcados (CEA 513) Codificação Segura para Embarcados Vicente Amorim vicente.amorim.ufop@gmail.com

2 Sumário * Introdução *

3 Introdução

4 Introdução * Desenvolvimento atualmente para embarcados se ancora basicamente em duas linguagens: C/C++ - Linguagem antiga? Sem uso? Ultrapassada? - TIOBE (09/2014)

5 Introdução * História da linguagem C : Ken Thompson criou o Unix (Bell Labs), em Assembly à partir de ideias do sistema operacional MULTICS : UNIX reescrito para PDP : Dennis Ritchie criou a linguagem C, a partir da linguagem B (Ken Thompson) e BCPL. - Linguagem C utilizada para escrever o UNIX! : Linguagem oficialmente publicada com o livro The C Programming Language.

6 Introdução * História da linguagem C /1990: 1o padrão: ANSI criou o comitê X3J11 em 1983 para a criação de um padrão para a linguagem, o que efetivamente só aconteceu em Tal padrão também foi aceito pela ISO e nomeado ISO/IEC (C90) /1996: Lançado o C95 através de várias correções em padrões anteriores : 2o padrão: ISO/IEC 9899:1999, conhecido como C : 3o padrão: ISO/IEC 9899:2011, conhecido como C11.

7 Introdução * C e Embarcados - Linguagem utilizada em uma série de ambientes e soluções. - Em embarcados talvez o contexto mais apropriado. - Na presença de um Sistema Operacional: Ex.: Linux.

8 Introdução * C e Embarcados - Entretanto, pode não haver um Sistema Operacional:

9 Introdução * C e Embarcados - C é flexível, portável entre arquiteturas distintas e enxuta (44 keywords). - Nem tudo são flores: Verificação em tempo de execução do C é pobre: Entretanto, código é pequeno e eficiente. Erros mais comuns encontrados: Manipulação de strings; Pilha; Alocação dinâmica de memória.

10 Introdução * C e Embarcados - Maioria dos erros são causados por humanos. Padrões de codificação podem ajudar na redução dos mesmos: MISRA-C (aplicado na aviação). Netrino s Embedded C coding standard. CERT C.

11 Introdução * Problemas podem aparecer durante o processo de desenvolvimento. * Ferramentas podem auxiliar na busca automatizada por erros e falhas: - Avaliação dos padrões através de ferramentas de análise: Estáticas: QA-C, CodeCheck, PC-lint,... Grátis: Splint. Dinâmicas: Valgrind / DUMA.

12 Introdução * Testes, validação e confiabilidade: - Testes podem provar a existência de erros, mas não a falta deles. - Quanto melhor a cobertura dos testes, mais confiável é seu programa. - Ferramentas para automatização de testes: Unity CppUTest

13

14 * Desenvolvedores em C/C++ comumente cometem erros parecidos. * Linguagem possui particularidades que precisam ser respeitadas. * Medidas a se evitar o pior caso são normalmente a alternativa mais comum: programação defensiva. * Conhecer o erros/problemas mais comuns ajuda a evitá-los.

15 * Manipulação de strings: - Cópias de strings sem limites; - Erros de off-by-one; - Null-termination; - Strings truncadas.

16 * Manipulação de strings: - Cópias de strings sem limites: Problema: Os dados são copiados de uma origem sem delimitação para um array de caracteres com tamanho fixo. Exemplo: Uso da função gets() -> deprecated no padrão C99 e inexistente no C11. MSC34-C: Do not use deprecated or obsolescent functions. STR35-C. Do not copy data from an unbounded source to a fixedlength array.

17 * Manipulação de strings: - Cópias de strings sem limites: - Exemplo 1: Problema?? Buffer Overflow!!! #include <stdio.h> static void get_user_name(void); static void get_user_name(void) { char name[8]; puts("insira seu nome: "); gets(name); if (name[0] == '\0') { printf("nenhum dado inserido!\n"); else { printf("muito obrigado!\n"); //TODO: processamento... int main(void) { get_user_name(); return 0;

18 * Manipulação de strings: - Cópias de strings sem limites: $ splint Exemplo1.c Splint May 2009 Exemplo1.c: (in function get_user_name) Exemplo1.c:8:5: Return value (type int) ignored: puts("insira seu... Result returned by function call is not used. If this is intended, can cast result to (void) to eliminate message. (Use -retvalint to inhibit warning) Exemplo1.c:9:5: Use of gets leads to a buffer overflow vulnerability. Use fgets instead: gets Use of function that may lead to buffer overflow. (Use -bufferoverflowhigh to inhibit warning) Exemplo1.c:9:5: Return value (type char *) ignored: gets(name) Result returned by function call is not used. If this is intended, can cast result to (void) to eliminate message. (Use -retvalother to inhibit warning) Finished checking code warnings

19 * Manipulação de strings: - Cópias de strings sem limites: - Exemplo 2: Corrigido! #include <stdio.h> static void get_user_name(void); static void get_user_name(void) { char name[8]; (void) puts("insira seu nome: "); if (fgets(name, (int) sizeof(name), stdin) == NULL) { printf("nenhum dado inserido!\n"); else { printf("nome: %s\n",name); printf("muito obrigado!\n"); // TODO: processamento... int main(void) { get_user_name(); return 0;

20 * Manipulação de strings: - Cópias de strings sem limites: - Corrigido: $ splint Exemplo2.c Splint May 2009 Finished checking --- no warnings - Outras funções perigosas: strcpy -> strncpy, stdup (não presente em C99 e C11) strcat -> strncat sprintf -> snprintf Never use gets(). Because it is impossible to tell without knowing the data in advance how many characters gets() will read, and because gets() will continue to store characters past the end of the buffer, it is extremely dangerous to use. It has been used to break computer security. Use fgets() instead. Fonte:

21 * Manipulação de strings: - Off-by-One: - Problema: Devido a um erro de indexação, é acessada uma posição além dos limites do buffer criado. - Exemplo 3: Problema?? #include <string.h> #include <stdio.h> #include <stdlib.h> int main(void) { char s1[] = " "; char s2[] = " "; char *dest; int i; strncpy(s1, s2, sizeof(s2)); dest = (char *) malloc(strlen(s1)); for (i = 1; i <= 11; i++) { dest[i] = s1[i]; dest[i] = '\0'; printf("dest = %s", dest); free(dest); return 0;

22 * Manipulação de strings: - Off-by-One: $ splint Exemplo3.c Splint May 2009 Exemplo3.c: (in function main) Exemplo3.c:16:9: Index of possibly null pointer dest: dest A possibly null pointer is dereferenced. Value is either the result of a function which may return null (in which case, code should check it is not null), or a global, parameter or structure field declared with the null qualifier. (Use -nullderef to inhibit warning) Exemplo3.c:13:12: Storage dest may become null Finished checking code warning - Problema: Acesso indevido a posição inexistente do buffer.

23 * Manipulação de strings: - NULL-termination: #include <string.h> #include <stdio.h> #include <stdlib.h> - Problema: Não terminar uma string com o caractere NULL ( \0 ). - Exemplo 4: int main(void) { char a[16]; char b[16]; char c[16]; $ splint Exemplo4.c Splint May 2009 Finished checking --- no warnings strncpy(a, " abcdef", sizeof(a)); strncpy(b, " abcdef", sizeof(b)); strcpy(c, a); return 0; STR32-C. Null-terminate byte strings as required. CERT C Secure Coding Standard

24 * Manipulação de strings: - NULL-termination: - Correção: Não terminar uma string com o caractere NULL ( \0 ). $ splint Exemplo5.c Splint May 2009 Finished checking --- no warnings - Exemplo 5: #include <string.h> #include <stdio.h> #include <stdlib.h> int main(void) { char a[16]; char b[16]; char c[16]; strncpy(a, " abcdef", sizeof(a)); a[sizeof(a) - 1] = '\0'; strncpy(b, " abcdef", sizeof(b)); b[sizeof(b) - 1] = '\0'; strcpy(c, a); return 0;

25 * Manipulação de strings: - Strings truncadas: - Problema: Determinado array de caracteres não é grande o bastante para armazenar uma string. - Exemplo 6: #include <stdio.h> int main(int argc, char *argv[]) { int i = 0; char buffer[32]; char *arg1 = argv[1]; if (argc == 1) { printf("sem argumentos!\n"); return -1; - Funções perigosas: Se não as uso, não tenho com o que me preocupar, certo?? $ splint Exemplo6.c Splint May 2009 Finished checking --- no warnings while (arg1[i]!= '\0') { buffer[i] = arg1[i]; i++; buffer[i] = '\0'; printf("buffer = %s\n", buffer); return 0;

26 * Manipulação de strings: - Strings truncadas: - Solução: Uma das possíveis é trocar a cópia iterativa por uma função segura (strncpy). - Iterativamente, deve-se levar em conta o tamanho do buffer destino. - Exemplo 7: (correção) #include <stdio.h> int main(int argc, char *argv[]) { char buffer[32]; char *arg1 = argv[1]; if (argc == 1) { printf("sem argumentos!\n"); return -1; strncpy(buffer, arg1, sizeof(arg1)); printf("buffer = %s\n", buffer); return 0;

27 * Vulnerabilidades gerais - Tainted data Tratamento de strings: Difícil saber o conteúdo dos dados recebidos e o seu tamanho. Usuários podem acidentalmente prover dados incorretos. Usuários podem deliberadamente prover dados incorretos. Então, dados podem estar contaminados (tainted). Como tratar?

28 * Vulnerabilidades gerais - Tainted data Validação dos dados é necessária. Problemas: Uso da função gets(); Não tratamento dos dados vindos do usuário; FIO04-C: Detect and handle input and output errors. CERT C Secure Coding Standard - Exemplo 8: #include <stdio.h> #include <string.h> #include <stdbool.h> bool IsPasswordOK(void) { char Password[12]; gets(password); return (0 == strcmp(password,"goodpass")); int main(void) { bool PwStatus; puts("enter your password: "); PwStatus = IsPasswordOK(); if (PwStatus == false) { puts("access denied!!"); return -1; else { puts("access granted!"); return 0;

29 * Vulnerabilidades gerais - Uma falha de segurança não indica, necessariamente, uma vulnerabilidade. - Vulnerabilidade se caracterizará se o intruso tiver acesso aos dados de entrada do sistema. - Intruso obteve acesso... E agora? O que pode acontecer? Arc Injection; e Code Injection. - Entretanto... Antes, um pouco de teoria.

30 * Vulnerabilidades gerais - Buffer Overflows 16 Bytes of Data Source Memory Destination Memory Copy Operation Allocated Memory (12 Bytes) Other Memory

31 * Vulnerabilidades gerais - Organização das regiões de memória em um processo:

32

33 * Vulnerabilidades gerais - Stack (pilha) Estrutura de dados dinâmica que suporta a execução de uma aplicação.: Quando uma função é chamada, esta estrutura armazena: 1) Dados passados por funções; 2) Variáveis locais; 3) Endereços de retorno das funções chamadoras; 4) Endereço base da pilha da função chamadora. Este conjunto de informações = Stack frame.

34 * Vulnerabilidades gerais - Stack (pilha)

35 * Vulnerabilidades gerais - Stack (pilha) Review funções principais registradores arquitetura x86 Intel: Registrador ebp esp eax ecx edx eip Função base pointer register stack pointer register accumulator register counter register (loop counter) data register index pointer register (inst. atual)

36 * Vulnerabilidades gerais - Stack (pilha) Exemplo 9: #include <stdio.h> void foo(int, char *); int main(void) { int MyInt = 1; char *MyStrPtr = "MyString"; foo(myint,mystrptr); 2o argumento colocado na pilha!! (MyStrPtr) foo(myint,mystrptr); 19: 8b c mov eax,dword PTR [esp+0x1c] 1d: mov DWORD PTR [esp+0x4],eax 21: 8b mov eax,dword PTR [esp+0x18] 25: mov DWORD PTR [esp],eax 28: e8 fc ff ff ff call 29 <main+0x29> Chamada ao método!! (foo(myint, MyStrPtr) return 0; 1o argumento colocado na pilha!! (MyInt) void foo(int MyInt, char *MyStrPtr) { char LocalChar[24]; int LocalInt; LocalInt++; return;

37 * Vulnerabilidades gerais - Stack (pilha) antes da chamada Endereço Valor Descrição Tamanho xbffff338 1 Variável local MyInt(int) 4 0xbffff33C 0x "MyString" Variável local MyStrPtr(char*) 4 0xbffff340? Endereço stack frame do SO 4 0xbffff344 0x804841d Endereço de retorno do SO 4 0xbffff348 SO (1) Primeiro argumento main (argc) 4 0xbffff34C 0xb7e3a4d3 Endereço que chamou main 4 $ebp $eip

38 * Vulnerabilidades gerais - Stack (pilha) Função foo() prólogo: Instruções que são executadas no início da função chamada: void foo(int MyInt, char *MyStrPtr) { 34: 55 push ebp 35: 89 e5 mov ebp,esp 37: 83 ec 38 sub esp,0x38 Função foo() epílogo: Instruções que são executadas ao final da função chamada: return; 4b: 8b 45 f4 mov eax,dword PTR [ebp-0xc] 4e: xor eax,dword PTR gs:0x14 55: je 5c <foo+0x28> 57: e8 fc ff ff ff call 58 <foo+0x24> 5c: c9 leave 5d: c3 ret

39 * Vulnerabilidades gerais - Stack (pilha) Função foo() é chamada e seus parâmetros são adicionados a pilha. Variáveis locais precisam ser consideradas. Contexto da função main() é mantido na pilha.

40 * Vulnerabilidades gerais - Stack (pilha) durante a chamada Endereço Valor Descrição Tamanho 0xbffff2ec 0x "MyString" Segundo argumento de foo() 4 0xbffff2f0 - Variável local LocalInt 4 0xbffff2f4 - Variável local LocalChar 24 0xbffff318 0xbffff348 Endereço stack frame da função main() 4 0xbffff31c 0x Endereço de retorno da função main() 4 0xbffff320 1 Primeiro argumento de foo() xbffff338 1 Variável local MyInt(int) 4 0xbffff33c 0x "MyString" Variável local MyStrPtr(char*) 4 0xbffff340? Endereço stack frame do SO 4 0xbffff344 0x804841d Endereço de retorno do SO 4 0xbffff348 SO (1) Primeiro argumento main (argc) 4 0xbffff34C 0xb7e3a4d3 Endereço que chamou main 4 $ebp $eip $ebp $eip

41 * Vulnerabilidades gerais - Stack (pilha) Ao final da função foo(), é necessário retomar o contexto da função main(). Variáveis locais precisam ser novamente consideradas. Contexto da função main() é mantido na pilha - mesmo na chamada de foo().

42 * Vulnerabilidades gerais - Stack (pilha) após a chamada Endereço Valor Descrição Tamanho 0xbffff2ec?????? 4 0xbffff2f0?????? 4 0xbffff2f4?????? 24 0xbffff318?????? 4 0xbffff31c?????? 4 0xbffff320?????? xbffff338 1 Variável local MyInt(int) 4 0xbffff33c 0x "MyString" Variável local MyStrPtr(char*) 4 0xbffff340? Endereço stack frame do SO 4 0xbffff344 0x804841d Endereço de retorno do SO 4 0xbffff348 SO (1) Primeiro argumento main (argc) 4 0xbffff34C 0xb7e3a4d3 Endereço que chamou main 4 $ebp $eip

43 * Vulnerabilidades gerais - Stack Smashing Como visto, buffer overflow pode causar danos. Na memória de pilha recebe o nome de stack smashing. Pode causar sérios problemas de confiabilidade de segurança. Buffer overflow na pilha pode permitir um atacante modificar valores de variáveis automáticas. Perda da integridade ou perda de dados confiáveis. Pior: Execução de código arbitrário!!!

44 * Vulnerabilidades gerais - Stack Smashing O exemplo de obtenção de senha do usuário pode sofrer com esse tipo de ataque. Antes da chamada ao IsPasswordOK(): $eip... puts("enter your password: "); PwStatus = IsPasswordOK(); if (PwStatus == false) { puts("access denied!!"); return -1; else { puts("access granted!"); return 0; $esp Stack Arm. de PwStatus (4bytes) %ebp q/ chamou (OS 4bytes) Endereço retorno main (OS 4bytes)

45 * Vulnerabilidades gerais - Stack Smashing Durante a chamada ao IsPasswordOK(): $eip... puts("enter your password: "); PwStatus = IsPasswordOK(); if (PwStatus == false) { puts("access denied!!"); return -1; else { puts("access granted!"); return 0; $esp Stack Arm. de Password (12bytes) %ebp q/ chamou (main 4bytes) Endereço retorno chamador (main 4bytes) Arm. de PwStatus (4bytes) %ebp q/ chamou (OS 4bytes) Endereço retorno main (OS 4bytes) bool IsPasswordOK(void) { char Password[12]; gets(password); return (0 == strcmp(password,"goodpass"));

46 * Vulnerabilidades gerais - Stack Smashing Após a chamada ao IsPasswordOK(): $eip... puts("enter your password: "); PwStatus = IsPasswordOK(); if (PwStatus == false) { puts("access denied!!"); return -1; else { puts("access granted!"); return 0; $esp Stack Arm. de Password (12bytes) %ebp q/ chamou (main 4bytes) Endereço retorno chamador (main 4bytes) Arm. de PwStatus (4bytes) %ebp q/ chamou (OS 4bytes) Endereço retorno main (OS 4bytes)

47 * Vulnerabilidades gerais - Stack Smashing Falha de segurança em IsPasswordOK(): Tentativa de armazenar um password maior que 11 caracteres gera crash. Com uma entrada de 20 caracteres, 21 caracteres são necessários para armazenar password: = 9 bytes restantes. 9 bytes restantes sobrescrevem alguma posição de memória previamente alocada.

48 * Vulnerabilidades gerais - Stack Smashing Durante a chamada ao IsPasswordOK(): $eip bool IsPasswordOK(void) { char Password[12]; gets(password); return (0 == strcmp(password,"goodpass")); $esp Stack Arm. de Password (12bytes) %ebp q/ chamou (main 4bytes) 3456 Endereço retorno chamador (main 4bytes) 7890 Arm. de PwStatus (4bytes) `\0` %ebp q/ chamou (OS 4bytes) Endereço retorno main (OS 4bytes)

49 * Vulnerabilidades gerais - Stack Smashing Falha de segurança em IsPasswordOK(): Quando uma falha ocorre, um usuário comum simplesmente tentará reiniciar o programa como forma de sanar o problema. Usuário mais experiente irá investigar e tentar descobrir a causa da falha e se a mesma pode ser explorada. Crash ocorre em razão de se sobrescrever o endereço de retorno. Memória no endereço: 1) Sem instrução de CPU válida; 2) Contém uma instrução mas valores nos registradores são inválidos; 3) Não é executável.

50 * Vulnerabilidades gerais - Arc Injection No exemplo anterior, entrada especial pode fazer com q/ o prog. produza saída inexperada. Em memória, os 4bytes da linha destacada alteram o endereço de retorno. Redirecionamento para outro trecho de código. Stack Arm. de Password (12bytes) %ebp q/ chamou (main 4bytes) 3456 Endereço retorno chamador (main 4bytes) ÄHP Arm. de PwStatus (4bytes) `\0` %ebp q/ chamou (OS 4bytes) Endereço retorno main (OS 4bytes)

51 * Vulnerabilidades gerais - Code Injection Raramente um endereço de retorno sobrescrito irá apontar para alguma instrução válida. Consequentemente, transferir o controle para o endereço especificado causa uma exceção e corrupção da pilha. Entretanto, uma entrada especialmente criada por um atacante pode causar a execução de um código malicioso.

52 * Vulnerabilidades gerais - Code Injection Quando a função chamada retorna para o endereço especificado - sobrescrito - o controle é transferido para outro código. Código malicioso irá executar com as mesmas permissões que o programa vulnerável - daí a constante busca pela exploração do root. Frequentemente o código inserido buscará formas de abrir - ou possibilitar a abertura - de um shell remoto.

53 $esp * Vulnerabilidades gerais - Code Injection Voltando ao código do Exemplo 8: Stack Arm. de Password (12bytes) #include <stdio.h> #include <string.h> #include <stdbool.h> bool IsPasswordOK(void) { char Password[12]; gets(password); return (0 == strcmp(password,"goodpass")); int main(void) { bool PwStatus; %ebp q/ chamou (main 4bytes) Endereço retorno chamador (main 4bytes) Arm. de PwStatus (4bytes) %ebp q/ chamou (OS 4bytes) Endereço retorno main (OS 4bytes) $eip puts("enter your password: "); PwStatus = IsPasswordOK(); if (PwStatus == false) { puts("access denied!!"); return -1; else { puts("access granted!"); return 0;

54 * Vulnerabilidades gerais - Code Injection Nova entrada para execução de Exemplo 8:

55 * Vulnerabilidades gerais - Stack Canary Aplicativos que fazem uso de sistemas operacionais e hardware com suporte a MMU podem facilmente detectar stack overflow. Utilizando GCC, a detecção de stack overflow é possível através de uma técnica conhecida como canary. Canary: Valor inteiro aleatório, gerado pelo processo atual que é adicionado pelo compilador em uma posição entre o endereço de retorno para a função chamadora e as variáveis locais da função.

56 * Vulnerabilidades gerais - Stack Canary Sem proteção:

57 * Vulnerabilidades gerais - Stack Canary Com proteção:

58 * Alocação Dinâmica de Memória - Posso utilizar alocação dinâmica em sistemas embarcados? Em geral: Utilizada quando não há conhecimento de antemão - tempo de compilação - do espaço de memória a ser utilizado. Principais pontos: Recursos voláteis são limitados (RAM, SRAM, DDRAM, etc); Implementação - ou existência - do gerenciador de memória; Determinismo: Necessário em sist. embarcados; Tratamento de erros;

59 * Alocação Dinâmica de Memória - Posso utilizar alocação dinâmica em sistemas embarcados? Principais pontos: (cont.) Normalmente funções de alocação não são reentrantes, o que pode ser um problema para sistemas multithreaded. Uma aplicação no PC pode gerar uma mensagem de erro, mas não um módulo de injeção do carro, um navegador do avião, etc.

60 * Alocação Dinâmica de Memória - Fragmentação de memória (8KB disponível)... p1 = malloc(1024); p2 = malloc(2048); p3 = malloc(1024);... free(p3); free(p2); free(p1);...

61 * Alocação Dinâmica de Memória - Fragmentação de memória (8KB disponível)... p1 = malloc(1024); p2 = malloc(2048); p3 = malloc(1024);... free(p3); free(p1);... Total: 8KB Alocado: 4KB Desalocado: 2KB Disponível: 6KB malloc(6* 1024) funciona??

62 * Alocação Dinâmica de Memória - Fragmentação de memória (8KB disponível)... p1 = malloc(1024); p2 = malloc(2048); p3 = malloc(1024);... free(p3); free(p1);... Não funciona! Existe memória livre, mas não memória contínua suficiente. Disponível continuamente: (max) 4KB!

63 * Alocação Dinâmica de Memória - Alternativas Memory Pool: Pools de memória contendo um número de blocos de tamanho fixo. Vantagem: Elimina fragmentação.. Desvantagem: Perda de memória (blocos de tamanho 8, 16, 32,... mas preciso de 17bytes);

64 * Alocação Dinâmica de Memória - Alternativas Garbage Collector: Aproxima os blocos de memória utilizados. Utilizado em linguagens como C#, Java, VisualBasic onde o acesso é feito a uma espécie de memória virtual. Vantagem: Elimina fragmentação aumentando o espaço livre conseguinte. Desvantagem: Não determinístico. Quando será executado? Quanto tempo levará para executar?

65 * Alocação Dinâmica de Memória - Implementação em sistemas bare-metal Dependente do ambiente usado (GNU, IAR, Keil, Renesas, etc). Se GNU pode ser usada uma biblioteca específica: Ex.: newlib - Implementa funcionalidade mínima para usar malloc e faz uso do símbolo _end criado no script do linker).

66 * Alocação Dinâmica de Memória - Implementação em sistemas com sistema operacional RTOS: Oferece implementação própria. Uso de memory pools e allocation call. Linux Embarcado: Utiliza a glibc/uclibc/etc que usam esquema de página típico de SOs unixlike. (4KB cada página) malloc (<= 4KB): Usa uma página do heap do processo; malloc (> 4KB): Usa mmap().

67 * Alocação Dinâmica de Memória Exemplo 10: #include <stdlib.h> int main(void) { char *x = malloc(10); x[10] = 'a'; return 0; $ splint Exemplo10.c Splint May 2009 Exemplo10.c: (in function main) Exemplo10.c:5:2: Index of possibly null pointer x: x A possibly null pointer is dereferenced. Value is either the result of a function which may return null (in which case, code should check it is not null), or a global, parameter or structure field declared with the null qualifier. (Use -nullderef to inhibit warning) Exemplo10.c:4:12: Storage x may become null Exemplo10.c:7:11: Fresh storage x not released before return A memory leak has been detected. Storage allocated locally is not released before the last reference to it is lost. (Use -mustfreefresh to inhibit warning) Exemplo10.c:4:23: Fresh storage x created Finished checking code warnings

68 * Alocação Dinâmica de Memória Exemplo 10: #include <stdlib.h> int main(void) { char *x = malloc(10); x[10] = 'a'; return 0; $ valgrind./exemplo10 ==3322== Memcheck, a memory error detector ==3322== Copyright (C) , and GNU GPL'd, by Julian Seward et al. ==3322== Using Valgrind and LibVEX; rerun with -h for copyright info ==3322== Command:./Exemplo10 ==3322== ==3322== Invalid write of size 1 ==3322== at 0x : main (in /media/sf_android_card/codigos/exemplo10) ==3322== Address 0x41f1032 is 0 bytes after a block of size 10 alloc'd ==3322== at 0x402BE68: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86- linux.so) ==3322== by 0x80483F8: main (in /media/sf_android_card/codigos/exemplo10) ==3322== ==3322== ==3322== HEAP SUMMARY: ==3322== in use at exit: 10 bytes in 1 blocks ==3322== total heap usage: 1 allocs, 0 frees, 10 bytes allocated ==3322== ==3322== LEAK SUMMARY: ==3322== definitely lost: 10 bytes in 1 blocks ==3322== indirectly lost: 0 bytes in 0 blocks ==3322== possibly lost: 0 bytes in 0 blocks ==3322== still reachable: 0 bytes in 0 blocks ==3322== suppressed: 0 bytes in 0 blocks ==3322== Rerun with --leak-check=full to see details of leaked memory ==3322== ==3322== For counts of detected and suppressed errors, rerun with: -v ==3322== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)

69 * Alocação Dinâmica de Memória Exemplo 11: #include <stdlib.h> #include <string.h> #define BUFF_SIZE 10 int main(void) { char *x = malloc(buff_size); $ splint Exemplo11.c Splint May 2009 Finished checking --- no warnings if (x!= NULL) { memset(x, 0, BUFF_SIZE); x[buff_size-1] = 'a'; free(x); return 0;

70 * Alocação Dinâmica de Memória Exemplo 11: #include <stdlib.h> #include <string.h> #define BUFF_SIZE 10 int main(void) { char *x = malloc(buff_size); if (x!= NULL) { memset(x, 0, BUFF_SIZE); x[buff_size-1] = 'a'; free(x); return 0; $ valgrind./exemplo11 ==3338== Memcheck, a memory error detector ==3338== Copyright (C) , and GNU GPL'd, by Julian Seward et al. ==3338== Using Valgrind and LibVEX; rerun with -h for copyright info ==3338== Command:./Exemplo11 ==3338== ==3338== ==3338== HEAP SUMMARY: ==3338== in use at exit: 0 bytes in 0 blocks ==3338== total heap usage: 1 allocs, 1 frees, 10 bytes allocated ==3338== ==3338== All heap blocks were freed -- no leaks are possible ==3338== ==3338== For counts of detected and suppressed errors, rerun with: -v ==3338== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

71 Referências

72 Referências * Codificação Segura em C para Sistemas Embarcados. Henrique Pérsico Rossi. 07, /07/16/tdc2013-codificacao-segura-em-c-para-sistemasembarcados/ * Secure Coding in C and C++ (2nd Edition). Seacord, Robert C. Addison-Wesley, * Secure Programming With Static Analysis. Chess, Brian. West, Jacob. Addison-Wesley, 2007.

Codificação segura em C para sistemas embarcados. Henrique Pérsico Rossi Julho/2013

Codificação segura em C para sistemas embarcados. Henrique Pérsico Rossi Julho/2013 Codificação segura em C para sistemas embarcados Henrique Pérsico Rossi Julho/2013 Apresentação Engenheiro Eletrônico (2005) e pós-graduado em Engenharia de Software (2012) Atuo com sistemas embarcados

Leia mais

Introdução rápida ao gerenciamento de memória: ou como evitar o maldito segmentation fault

Introdução rápida ao gerenciamento de memória: ou como evitar o maldito segmentation fault Universidade de São Paulo Instituto de Ciências Matemáticas e de Computação Introdução rápida ao gerenciamento de memória: ou como evitar o maldito segmentation fault Moacir Ponti 2012 (v.1.1) Sumário

Leia mais

Linguagem C. Análise estática de programas C - splint. Compilador de C - gcc. Compilador de C - gcc. Diagnóstico e correcção de problemas

Linguagem C. Análise estática de programas C - splint. Compilador de C - gcc. Compilador de C - gcc. Diagnóstico e correcção de problemas Conteúdo Diagnóstico e correcção de problemas (jpo@di.uminho.pt) Grupo de Sistemas Distribuídos Departamento de Informática Escola de Engenharia Universidade do Minho 1 Linguagem de programação C Análise

Leia mais

Gilberto A. S. Segundo. 24 de agosto de 2011

Gilberto A. S. Segundo. 24 de agosto de 2011 Exercícios - Alocação Dinâmica Gilberto A. S. Segundo Programação Aplicada de Computadores Engenharia Elétrica Universidade Federal do Espírito Santo - UFES 24 de agosto de 2011 1 / 23 Grupo de e-mail

Leia mais

Pilha de execução Volnys Borges Bernal Departamento de Sistemas Eletrônicos (PSI) Escola Politécnica da USP

Pilha de execução Volnys Borges Bernal Departamento de Sistemas Eletrônicos (PSI) Escola Politécnica da USP 2005-2015 Volnys Bernal 1 Pilha de execução Volnys Borges Bernal volnys@lsi.usp.br Departamento de Sistemas Eletrônicos (PSI) Escola Politécnica da USP 2005-2015 Volnys Bernal 2 Agenda Os desafios da execução

Leia mais

Compiladores Ambiente de Execução

Compiladores Ambiente de Execução Compiladores Ambiente de Execução Fabio Mascarenhas 2015.1 http://www.dcc.ufrj.br/~fabiom/comp O Back-end Até agora vimos as fases do front-end do compilador: Análise Léxica Análise Sintática Análise Semântica

Leia mais

Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP. Alocação Dinâmica de Memória

Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP. Alocação Dinâmica de Memória Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP Alocação Dinâmica de Memória Alocação Estática x Dinâmica C: dois tipos de alocação de memória: Estática e Dinâmica Na alocação estática, o espaço

Leia mais

Modulo 12: alocação dinâmica de memória

Modulo 12: alocação dinâmica de memória PROGRAMAÇÃO DE COMPUTADORES V - TCC- 00.323 Modulo 12: alocação dinâmica de memória Aura - Erick aconci@ic.uff.br, erickr@id.uff.br Roteiro porque e como utilizar a alocação dinâmica funções: malloc (

Leia mais

Programação Estruturada Prof. Rodrigo Hausen Organização e Gerenciamento de Memória

Programação Estruturada Prof. Rodrigo Hausen  Organização e Gerenciamento de Memória Programação Estruturada Prof. Rodrigo Hausen http://progest.compscinet.org Organização e Gerenciamento de Memória 1 AULA PASSADA - vetores ou arrays Declaração de um vetor (array) em C: tipo nome[tamanho];

Leia mais

Programação II. Vetores e Alocação Dinâmica. Bruno Feijó Dept. de Informática, PUC-Rio

Programação II. Vetores e Alocação Dinâmica. Bruno Feijó Dept. de Informática, PUC-Rio Programação II Vetores e Alocação Dinâmica Bruno Feijó Dept. de Informática, PUC-Rio Vetores (arrays) Vetor: estrutura de dados definindo um conjunto enumerável Exemplo: v = vetor de inteiros com 10 elementos

Leia mais

INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA RIO GRANDE DO NORTE

INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA RIO GRANDE DO NORTE INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA RIO GRANDE DO NORTE Algoritmos ANSI C - Gerenciamento de Memória Copyright 2014 IFRN Agenda Introdução Alocação dinâmica Funções malloc free calloc realloc

Leia mais

Linguagem C. Diagnóstico e correcção de problemas. Arquitectura física. José Pedro Oliveira (jpo@di.uminho.pt) Linguagem de programação

Linguagem C. Diagnóstico e correcção de problemas. Arquitectura física. José Pedro Oliveira (jpo@di.uminho.pt) Linguagem de programação Conteúdo Diagnóstico e correcção de problemas (jpo@di.uminho.pt) Grupo de Sistemas Distribuídos Departamento de Informática Escola de Engenharia Universidade do Minho 1 Arquitectura física Linguagem de

Leia mais

Compiladores Geração de Código

Compiladores Geração de Código Compiladores Geração de Código Fabio Mascarenhas - 2013.2 http://www.dcc.ufrj.br/~fabiom/comp O Back-end Até agora vimos as fases do front-end do compilador: Análise Léxica Análise Sintática Análise Semântica

Leia mais

Algoritmos e Estruturas de dados

Algoritmos e Estruturas de dados Algoritmos e Estruturas de dados Listas Encadeadas Prof. Dr. Fábio Rodrigues de la Rocha (Listas Encadeadas) 1 / 21 Definição: Anteriormente estudamos listas encadeadas que foram implementadas como vetores

Leia mais

Princípios de Desenvolvimento de Algoritmos MAC122

Princípios de Desenvolvimento de Algoritmos MAC122 Princípios de Desenvolvimento de Algoritmos MAC122 Prof. Dr. Paulo Miranda IME-USP Vazamento de memória & Erros em tempo de execução Vazamento de memória Introdução: Vazamento de memória (memory leak),

Leia mais

Alocação Dinâmica em C

Alocação Dinâmica em C Universidade de São Paulo São Carlos Instituto de Ciências Matemáticas e de Computação Alocação Dinâmica em C Profa Rosana Braga Adaptado de material preparado pela profa Silvana Maria Affonso de Lara

Leia mais

Estruturas de Dados Aulas 3 e 4: Uso da. 14/03/2011 e 16/03/2011

Estruturas de Dados Aulas 3 e 4: Uso da. 14/03/2011 e 16/03/2011 Estruturas de Dados Aulas 3 e 4: Uso da memória e Vetores 14/03/2011 e 16/03/2011 Uso da memória Existem 3 maneiras de reservar o espaço da memória: Variáveis globais (estáticas) Espaço existe enquanto

Leia mais

Aula 3. Ivan Sendin. 22 de agosto de FACOM - Universidade Federal de Uberlândia SEG. Ivan Sendin.

Aula 3. Ivan Sendin. 22 de agosto de FACOM - Universidade Federal de Uberlândia SEG. Ivan Sendin. Segurança Aula 3 FACOM - Universidade Federal de Uberlândia ivansendin@yahoo.com,sendin@ufu.br 22 de agosto de 2018 Informação =$$ Confidencialidade, Integridade e Disponibilidade (qual é mais importante?)

Leia mais

Fundamentos de Programação

Fundamentos de Programação Fundamentos de Programação ET42G Aula 21 Prof. Daniel Cavalcanti Jeronymo Conversão de tipos. Alocação dinâmica de memória. Recursão. Criação de bibliotecas, arquivos de cabeçalhos e variáveis globais.

Leia mais

Estruturas de Dados Aulas 3 e 4: Uso da memória e Vetores

Estruturas de Dados Aulas 3 e 4: Uso da memória e Vetores Estruturas de Dados Aulas 3 e 4: Uso da memória e Vetores Uso da memória Existem 3 maneiras de reservar o espaço da memória: Variáveis globais (estáticas) Espaço existe enquanto programa estiver executando

Leia mais

Curso de Programação C em Ambientes Linux Aula 05

Curso de Programação C em Ambientes Linux Aula 05 Curso de Programação C em Ambientes Linux Aula 05 Centro de Engenharias da Mobilidade - UFSC Professores Gian Berkenbrock e Giovani Gracioli http://www.lisha.ufsc.br/c+language+course+resources Conteúdo

Leia mais

Linguagem C. Brian W. Kernighan, Dennis Ritchie (K&R) Slides adaptados, inspirados, muitos copiados dos slides do professor Pedro Pereira

Linguagem C. Brian W. Kernighan, Dennis Ritchie (K&R) Slides adaptados, inspirados, muitos copiados dos slides do professor Pedro Pereira Linguagem C Brian W. Kernighan, Dennis Ritchie (K&R) Slides adaptados, inspirados, muitos copiados dos slides do professor Pedro Pereira Centro de Cálculo Instituto Superior de Engenharia de Lisboa João

Leia mais

Conceitos Básicos de C

Conceitos Básicos de C Conceitos Básicos de C Bibliografia Problem Solving & Program design in C, Jeri R. Hanly e Elliot B. Kpffman, 3 a edição Data Structures and Algorithm Analysis in C, Mark Allen Weiss, 2 a edição, Addison-Wesley,

Leia mais

Programação Estruturada

Programação Estruturada Programação Estruturada Ponteiros Parte 1 Professores Emílio Francesquini e Carla Negri Lintzmayer 2018.Q3 Centro de Matemática, Computação e Cognição Universidade Federal do ABC Ponteiros Ponteiro Ponteiros

Leia mais

Exercício. Alocação Dinâmica. Alocação dinâmica de memória. Alocação de memória. Alocação da Memória Principal. Alocação da Memória Principal

Exercício. Alocação Dinâmica. Alocação dinâmica de memória. Alocação de memória. Alocação da Memória Principal. Alocação da Memória Principal Exercício Crie uma função que recebe o número de dias até um determinado evento e calcula e retorna o equivalente em meses, semanas e dias, sem usar vetor ou o conceito de vetor. Considerar que todos os

Leia mais

Linguagem C. Produção de programas em C (Ligação dinâmica) João Pedro Patriarca

Linguagem C. Produção de programas em C (Ligação dinâmica) João Pedro Patriarca Capítulo 7, secções 10-12 Linguagem C Produção de programas em C (Ligação dinâmica) Centro de Cálculo Instituto Superior de Engenharia de Lisboa João Pedro Patriarca (jpatri@cc.isel.ipl.pt) Ligação estática

Leia mais

Básico: estrutura de programa, sintaxe Interface com linha de comando

Básico: estrutura de programa, sintaxe Interface com linha de comando Programação em C Sintaxe Básico: estrutura de programa, sintaxe Interface com linha de comando Preprocessamento e compilação Makefiles Ponteiros e estruturas Bibliotecas, ficheiros include e funções Referências

Leia mais

Programação. Cap. 12 Gestão de Memória Dinâmica

Programação. Cap. 12 Gestão de Memória Dinâmica Programação Engenharia Informática (11543) 1º ano, 1º semestre Tecnologias e Sistemas de Informação (6619) 1º ano, 1º semestre Cap. 12 Gestão de Memória Dinâmica Sumário : Utilização de memória Alocação

Leia mais

Ana Paula Tomás. Departamento de Ciência de Computadores Faculdade de Ciências da Universidade do Porto 2010/2011

Ana Paula Tomás. Departamento de Ciência de Computadores Faculdade de Ciências da Universidade do Porto 2010/2011 Ana Paula Tomás Departamento de Ciência de Computadores Faculdade de Ciências da Universidade do Porto 2010/2011 Aula 1 Objectivos e programa da disciplina. Critérios de avaliação. Um primeiro programa

Leia mais

Programação Mestrado Integrado em Engenharia Aeronáutica 1º ano, 1º semestre. T. 11 Gestão de Memória Dinâmica

Programação Mestrado Integrado em Engenharia Aeronáutica 1º ano, 1º semestre. T. 11 Gestão de Memória Dinâmica Programação Mestrado Integrado em Engenharia Aeronáutica 1º ano, 1º semestre T. 11 Gestão de Memória Dinâmica 1 Sumário : Utilização de memória Alocação Estática de Memória Alocação Dinâmica de Memória

Leia mais

Sistemas Operacionais. Rodrigo Rubira Branco rodrigo@kernelhacking.com rodrigo@fgp.com.br. www.fgp.com.br

Sistemas Operacionais. Rodrigo Rubira Branco rodrigo@kernelhacking.com rodrigo@fgp.com.br. www.fgp.com.br Sistemas Operacionais Rodrigo Rubira Branco rodrigo@kernelhacking.com rodrigo@fgp.com.br Tipos de Sistemas Operacionais De Sistemas Embarcados (PalmOS,WinCE,WinXPEmbbeded,Linux) Hardware simples, especifico

Leia mais

Linguagem de Programação. Thiago Leite Francisco Barretto

Linguagem de Programação. Thiago Leite Francisco Barretto Linguagem de Programação Thiago Leite Francisco Barretto SCHILDT, H. C Completo e Total. 3ª Edição. São Paulo: Makron, 1997. Bibliografia Ementa

Leia mais

MICROPROCESSADORES II (EMA911915) SUB-ROTINAS E PILHA 2 O SEMESTRE / 2018

MICROPROCESSADORES II (EMA911915) SUB-ROTINAS E PILHA 2 O SEMESTRE / 2018 MICROPROCESSADORES II (EMA911915) SUB-ROTINAS E PILHA 2 O SEMESTRE / 2018 MATERIAL DIDÁTICO Harris & Harris 6.4.6 Procedure Calls Patterson & Hennessy (4a edição) 2.8 Supporting Procedures in Computer

Leia mais

Sistemas Operacionais. Pilha de execução Volnys B. Bernal 1. Agenda. Pilha de execução. Os problemas. Os problemas.

Sistemas Operacionais. Pilha de execução Volnys B. Bernal 1. Agenda. Pilha de execução. Os problemas. Os problemas. 25-215 Volns Bernal 1 25-215 Volns Bernal 2 Agenda Volns Borges Bernal volns@lsi.u.br Os problemas Controle do endereço de retorno da função Controle do quadro da pilha de Departamento de Sistemas Eletrônicos

Leia mais

ALGORITMOS AULA 01. Baseado nas aulas do Prof. Jorgiano Vidal

ALGORITMOS AULA 01. Baseado nas aulas do Prof. Jorgiano Vidal ALGORITMOS AULA 01 Baseado nas aulas do Prof. Jorgiano Vidal LINGUAGEM C Uma das grandes vantagens do C é que ele possui tanto caracterìsticas de "alto nìvel" quanto de "baixo nìvel". Linguagem de propósito

Leia mais

Programação em Sistemas Computacionais

Programação em Sistemas Computacionais Programação em Sistemas Computacionais Linguagem C Introdução, tipos Centro de Cálculo Instituto Superior de Engenharia de Lisboa Jorge Martins (jmartins@isel.pt) baseado no slides de Pedro Pereira Enquadramento

Leia mais

INTRODUÇÃO BUFFER OVERFLOWS

INTRODUÇÃO BUFFER OVERFLOWS BUFFER OVERFLOW INTRODUÇÃO As vulnerabilidades de buffer overflow são consideradas ameaças críticas de segurança, apesar de ser uma falha bem-conhecida e bastante séria, que se origina exclusivamente na

Leia mais

Linguagem C Princípios Básicos (parte 1)

Linguagem C Princípios Básicos (parte 1) Linguagem C Princípios Básicos (parte 1) Objetivos O principal objetivo deste artigo é explicar alguns conceitos fundamentais de programação em C. No final será implementado um programa envolvendo todos

Leia mais

Programação II. Vetores e Alocação Dinâmica. Bruno Feijó Dept. de Informática, PUC-Rio

Programação II. Vetores e Alocação Dinâmica. Bruno Feijó Dept. de Informática, PUC-Rio Programação II Vetores e Alocação Dinâmica Bruno Feijó Dept. de Informática, PUC-Rio Vetores (arrays) Vetor: estrutura de dados definindo um conjunto enumerável Exemplo: v = vetor de inteiros com 10 elementos

Leia mais

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

Computadores Digitais 2. Prof. Rodrigo de Souza Couto Computadores Digitais 2 Linguagens de Programação DEL-Poli/UFRJ Prof. Miguel Campista Aula de Hoje Vetores e alocação dinâmica Vetores Alocação dinâmica Vetores locais e funções ATENÇÃO Esta apresentação

Leia mais

Compiladores Ambiente de Execução

Compiladores Ambiente de Execução Compiladores Ambiente de Execução Fabio Mascarenhas 2015.2 http://www.dcc.ufrj.br/~fabiom/comp O Back-end Até agora vimos as fases do front-end do compilador: Análise Léxica Análise Sintática Análise Semântica

Leia mais

INSTITUTO FEDERAL DE! EDUCAÇÃO, CIÊNCIA E TECNOLOGIA RIO GRANDE DO NORTE

INSTITUTO FEDERAL DE! EDUCAÇÃO, CIÊNCIA E TECNOLOGIA RIO GRANDE DO NORTE INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA RIO GRANDE DO NORTE Algoritmos ANSI C - Introdução Copyright 2014 IFRN Agenda Conceitos básicos ANSI C Hello World Funções em C Exercícios 2 /26 A linguagem

Leia mais

Tutorial Ultra-rápido: desenvolvendo programas C em Unix

Tutorial Ultra-rápido: desenvolvendo programas C em Unix Tutorial Ultra-rápido: desenvolvendo programas C em Unix Jerônimo C. Pellegrini 1 Introdução Este é um breve guia para programação em C em Unix. O texto está longe de ser completo (na verdade nem tem estrutura

Leia mais

Ponteiros & tabelas (cont.) K&R: Capítulo 5

Ponteiros & tabelas (cont.) K&R: Capítulo 5 Ponteiros & tabelas (cont.) K&R: Capítulo 5 Sinopse da aula de hoje Pointers in a nutshell & alocação dinâmica de memória Estruturas, funções e apontadores Estruturas auto-referenciadas Exemplo de aplicação:

Leia mais

MCTA028 Programação Estruturada Aula 01: - Introdução à linguagem C - Teste de avaliação

MCTA028 Programação Estruturada Aula 01: - Introdução à linguagem C - Teste de avaliação MCTA028 Programação Estruturada Aula 01: - Introdução à linguagem C - Teste de avaliação Prof. João Henrique Kleinschmidt Material elaborado pelo Prof. Jesús P. Mena-Chalco 3Q-2018 Linguagens de programação

Leia mais

Programação Estruturada Aula - Introdução a Linguagem C

Programação Estruturada Aula - Introdução a Linguagem C Programação Estruturada Aula - Introdução a Linguagem C Prof. Flávio Barros flavioifma@gmail.com www.flaviobarros.com.br 2 HISTÓRICO DA LINGUAGEM C HISTÓRICO DA LINGUAGEM C Como tudo iniciou... C iniciou

Leia mais

Linguagem C Introdução. Contexto Histórico Principais diferenças do Java Funções em C Compilar programas em C no Linux

Linguagem C Introdução. Contexto Histórico Principais diferenças do Java Funções em C Compilar programas em C no Linux Linguagem C Introdução Contexto Histórico Principais diferenças do Java Funções em C Compilar programas em C no Linux Porquê C em AC? A linguagem C fornece um modelo de programação próximo da máquina física

Leia mais

MCTA028 Programação Estruturada Aula 01: - Introdução à linguagem C - Teste de avaliação

MCTA028 Programação Estruturada Aula 01: - Introdução à linguagem C - Teste de avaliação MCTA028 Programação Estruturada Aula 01: - Introdução à linguagem C - Teste de avaliação Prof. Jesús P. Mena-Chalco jesus.mena@ufabc.edu.br 3Q-2017 1 Linguagens de programação 2 Linguagem de programação

Leia mais

Estrutura de Dados. Aula 07 Alocação Dinâmica

Estrutura de Dados. Aula 07 Alocação Dinâmica Estrutura de Dados Aula 07 Alocação Dinâmica 2 ALOCAÇÃO DINÂMICA Existem três modos de reservar espaço de memória para o armazenamento de informações: 1ª - através do uso de variáveis globais (e estáticas).

Leia mais

Ponteiros. Introdução

Ponteiros. Introdução Ponteiros Introdução Conceito Um PONTEIRO ou APONTADOR é uma variável usada para armazenar um endereço de memória. Normalmente, o endereço armazenado em um PONTEIRO é a posição de uma outra variável na

Leia mais

#include <stdio.h> Void main() { printf( Cheguei!\n"); } INTRODUÇÃO A LINGUAGEM C

#include <stdio.h> Void main() { printf( Cheguei!\n); } INTRODUÇÃO A LINGUAGEM C #include Void main() { printf( Cheguei!\n"); } INTRODUÇÃO A LINGUAGEM C ANTES DO C ERA A LINGUAGEM B B foi essencialmente uma simplificação da linguagem BCPL. B só tinha um tipo de dado, que

Leia mais

Ponteiros e Tabelas. K&R: Capitulo 5 IAED, 2012/2013

Ponteiros e Tabelas. K&R: Capitulo 5 IAED, 2012/2013 Ponteiros e Tabelas K&R: Capitulo 5 Ponteiros e Tabelas Ponteiros e endereços Ponteiros e argumentos de funções Ponteiros e tabelas Alocação dinâmica de memória Aritmética de ponteiros Tabelas de ponteiros

Leia mais

Ponteiros e Tabelas. K&R: Capitulo 5 IAED, 2012/2013

Ponteiros e Tabelas. K&R: Capitulo 5 IAED, 2012/2013 Ponteiros e Tabelas K&R: Capitulo 5 Ponteiros e Tabelas Ponteiros e endereços Ponteiros e argumentos de funções Ponteiros e tabelas Alocação dinâmica de memória Aritmética de ponteiros Tabelas de ponteiros

Leia mais

A linguagem C (visão histórica)

A linguagem C (visão histórica) A linguagem C (visão histórica) A linguagem C é uma linguagem de programação desenvolvida no ínício dos anos 70 por Dennis Ritchie, que trabalhava nos laboratórios Bell e que também inciou em paralelo,

Leia mais

Alocação Dinâmica. Introdução à Computação

Alocação Dinâmica. Introdução à Computação Alocação Dinâmica Introdução à Computação Alocação de memória Uso da memória: uso de variáveis globais (e está>cas): O espaço reservado para uma variável global existe enquanto o programa es>ver sendo

Leia mais

Exercícios. Alocação Dinâmica. Alocação dinâmica de memória. Alocação de memória. Alocação da Memória Principal. Alocação da Memória Principal

Exercícios. Alocação Dinâmica. Alocação dinâmica de memória. Alocação de memória. Alocação da Memória Principal. Alocação da Memória Principal Exercícios 1) Crie uma função que recebe os coeficientes de uma função do 2o. grau e retorna as raízes sem usar vetor. 2) Faça um programa que acha o maior e o menor inteiro dentro de um vetor de 10 inteiros,

Leia mais

Ferramentas de desenvolvimento

Ferramentas de desenvolvimento Conteúdo Breve Introdução (jpo@di.uminho.pt) Grupo de Sistemas Distribuídos Departamento de Informática Escola de Engenharia Universidade do Minho 1 2 Sistemas Operativos I 2006-2007 - Exemplo de um programa

Leia mais

Programação Computacional Aula 16: Alocação Dinâmica de Memória

Programação Computacional Aula 16: Alocação Dinâmica de Memória Programação Computacional Aula 16: Alocação Dinâmica de Memória Profa. Madeleine Medrano madeleine@icte.uftm.edu.br Definição Sempre que escrevemos um programa, é preciso reservar espaço para as informações

Leia mais

Computação 2. Aula Profª. Fabiany Listas Duplamente Encadeadas

Computação 2. Aula Profª. Fabiany Listas Duplamente Encadeadas Computação 2 Aula 10.1 Listas Duplamente Encadeadas Profª. Fabiany fabianyl@utfpr.edu.br ListaEncadeada.h #ifndef _LISTAENCADEADA_H_ #define _LISTAENCADEADA_H_ #include #include #include

Leia mais

Estruturas de Dados Aula 6: Cadeias de 28/03/2010

Estruturas de Dados Aula 6: Cadeias de 28/03/2010 Estruturas de Dados Aula 6: Cadeias de Caracteres 28/03/2010 Caracteres Caracteres são representados internamente por códigos numéricos Tipo char (inteiro pequeno ) 1 byte (8 bits) 256 caracteres possíveis

Leia mais

Estruturas de Dados Aula 6: Cadeias de Caracteres

Estruturas de Dados Aula 6: Cadeias de Caracteres Estruturas de Dados Aula 6: Cadeias de Caracteres Caracteres Caracteres são representados internamente por códigos numéricos Tipo char (inteiro pequeno ) 1 byte (8 bits) 256 caracteres possíveis Códigos

Leia mais

- Mapa de memória de um processo - Ponteiros

- Mapa de memória de um processo - Ponteiros 1 MCTA028 Programação Estruturada - Mapa de memória de um processo - Ponteiros Material preparado a partir de slides dos profs. Jesús Mena-Chalco e Fabrício Olivetti Luiz Rozante 3Q-2018 2 Alocação de

Leia mais

A linguagem C permite dois tipos de alocação de memória: Alocação estática e alocação dinâmica.

A linguagem C permite dois tipos de alocação de memória: Alocação estática e alocação dinâmica. Alocação de Memória Todo programa precisa utilizar memória para ser executado. Quando um programa inicia sua execução, ele começa a solicitar memória ao sistema operacional, ou seja, faz a alocação de

Leia mais

Programação de Computadores I Introdução ao C PROFESSORA CINTIA CAETANO

Programação de Computadores I Introdução ao C PROFESSORA CINTIA CAETANO Programação de Computadores I Introdução ao C PROFESSORA CINTIA CAETANO Introdução Criada em 1972, por Dennis Ritchie; Centro de Pesquisas da Bell Laboratories; Para utilização no S.O. UNIX; C é uma linguagem

Leia mais

16. Compilação no Linux

16. Compilação no Linux 16. Compilação no Linux 16.1 Compilador X Interpretador Um código fonte pode ser compilado ou interpretado. Compiladores e interpretadores tratam o código de maneira diferente. Interpretador: Lê o código

Leia mais

Módulo 5 Vetores e Alocação Dinâmica

Módulo 5 Vetores e Alocação Dinâmica Estruturas de Dados Módulo 5 Vetores e Alocação Dinâmica 1/9/2005 (c) Dept. Informática - PUC-Rio 1 Referências Waldemar Celes, Renato Cerqueira, José Lucas Rangel, Introdução a Estruturas de Dados, Editora

Leia mais

# Estrutura de Dados # Aula - Revisão de C/C++ na Prática. Prof. Leinylson Fontinele Pereira

# Estrutura de Dados # Aula - Revisão de C/C++ na Prática. Prof. Leinylson Fontinele Pereira # Estrutura de Dados # Aula - Revisão de C/C++ na Prática Prof. Leinylson Fontinele Pereira Na aula anterior... Ponteiros Funções Introdução 3 O que vamos aprender? Preparação do ambiente de testes Conceitos

Leia mais

Introdução à Linguagem C. K&R: Capitulo 1. Introdução IAED, 2014/2015 2

Introdução à Linguagem C. K&R: Capitulo 1. Introdução IAED, 2014/2015 2 Introdução Introdução à Linguagem C K&R: Capitulo 1 Desenvolvida em 1972 por Dennis Ritchie, nos Bell Labs, para utilização no sistema operativo UNIX O standard ANSI C (ISO/IEC 9899:1990) foi adoptado

Leia mais

Estruturas de Dados. Profa. Juliana Pinheiro Campos

Estruturas de Dados. Profa. Juliana Pinheiro Campos Estruturas de Dados Profa. Juliana Pinheiro Campos Vetores Forma mais simples de estruturar um conjunto de dados. Exemplo: int p[10]; // vetor de inteiros com 10 elementos Reserva de um espaço de memória

Leia mais

Computação 2. Aula 8. Profª. Fabiany Arquivos

Computação 2. Aula 8. Profª. Fabiany Arquivos Computação 2 Aula 8 Arquivos Profª. Fabiany fabianyl@utfpr.edu.br E/S com Arquivos A linguagem C não possui nenhum comando de E/S. Todas as operações de E/S ocorrem mediante chamadas a funções de biblioteca

Leia mais

Módulo 7 Cadeias de Caracteres

Módulo 7 Cadeias de Caracteres Estruturas de Dados Módulo 7 Cadeias de Caracteres 9/8/2005 (c) Dept. Informática - PUC-Rio 1 Referências Waldemar Celes, Renato Cerqueira, José Lucas Rangel, Introdução a Estruturas de Dados, Editora

Leia mais

Fundamentos de Programação

Fundamentos de Programação Fundamentos de Programação CP41F Aula 12 Prof. Daniel Cavalcanti Jeronymo Layout de memória. Ponteiros: conceito, operadores de referência e dereferência, operações, aritmética e indireção múltipla Universidade

Leia mais

Linguagem C. Ponteiros. Alex Vidigal Bastos.

Linguagem C. Ponteiros. Alex Vidigal Bastos. Linguagem C Ponteiros Alex Vidigal Bastos alexvbh@gmail.com Ponteiros Ponteiros são variáveis que contém endereços. Estas variáveis apontam para algum determinado endereço da memória. Em geral, o ponteiro

Leia mais

Seminário C & C++ para Sistemas Embarcados 2010. Desenvolvendo software seguro em C. Sergio Prado - Novembro/2010

Seminário C & C++ para Sistemas Embarcados 2010. Desenvolvendo software seguro em C. Sergio Prado - Novembro/2010 Seminário C & C++ para Sistemas Embarcados 2010 Desenvolvendo software seguro em C Sergio Prado - Novembro/2010 Quem sou eu? Formado em eletrônica, graduado em Processamento de Dados e pósgraduado em Gestão

Leia mais

SSC304 Introdução à Programação Para Engenharias. Alocação Dinâmica. GE4 Bio

SSC304 Introdução à Programação Para Engenharias. Alocação Dinâmica. GE4 Bio Universidade de São Paulo Instituto de Ciências Matemáticas e de Computação Departamento de Sistemas de Computação Introdução à Para Engenharias GE4 Bio GE4Bio Grupo de Estudos em Sinais Biológicos Prof.Dr.

Leia mais

LINGUAGEM C: ALOCAÇÃO DINÂMICA

LINGUAGEM C: ALOCAÇÃO DINÂMICA LINGUAGEM C: ALOCAÇÃO DINÂMICA Prof. André Backes DEFINIÇÃO Sempre que escrevemos um programa, é preciso reservar espaço para as informações que serão processadas. Para isso utilizamos as variáveis Uma

Leia mais

Programando em Assembly

Programando em Assembly Programando em Assembly precisa-se saber exatamente como interpretar & gerenciar a memória e como usar instruções de baixo nível para o processamento Não existem tipos e variáveis (apenas bytes na memória)

Leia mais

Exercícios sobre textos; Alocação dinâmica.

Exercícios sobre textos; Alocação dinâmica. s sobre textos; Alocação dinâmica. David Deharbe 1 1 s Escreva uma sub-rotina, chamada strchr, que recebe um string s (= o endereço onde está guardado um texto), um caracter c e retorna o endereço da primeira

Leia mais

Aula 07: - Mapa de memória de um processo - Ponteiros (parte 1)

Aula 07: - Mapa de memória de um processo - Ponteiros (parte 1) MCTA028 Programação Estruturada Aula 07: - Mapa de memória de um processo - Ponteiros (parte 1) Prof. João Henrique Kleinschmidt Material elaborado pelo prof. Jesús P. Mena-Chalco 3Q-20108 Mapa de memória

Leia mais

INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA RIO GRANDE DO NORTE

INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA RIO GRANDE DO NORTE INSTITUTO FEDERAL DE EDUCAÇÃO, CIÊNCIA E TECNOLOGIA RIO GRANDE DO NORTE Algoritmos ANSI C - Arquivos Copyright 2014 IFRN Agenda Conceito Tipos de arquivos Texto Binário Stream Principais funções Exemplos

Leia mais

ALGORITMOS E ESRUTRA DE DADOS I. Ponteiros Passagem por Valor e Referência Alocação de Memória

ALGORITMOS E ESRUTRA DE DADOS I. Ponteiros Passagem por Valor e Referência Alocação de Memória ALGORITMOS E ESRUTRA DE DADOS I Ponteiros Passagem por Valor e Referência Alocação de Memória 2 Agenda Ponteiros Conceitos gerais O que é Ponteiro? Declaração de Ponteiros Operadores para Ponteiros Exemplos

Leia mais

Algoritmos e Estruturas de Dados. Prof. Marcelo Zorzan Profa. Melissa Zanatta

Algoritmos e Estruturas de Dados. Prof. Marcelo Zorzan Profa. Melissa Zanatta Algoritmos e Estruturas de Dados Prof. Marcelo Zorzan Profa. Melissa Zanatta Assuntos da Aula Alocação de Memória Alocação estática de memória Alocação dinâmica de memória Malloc, Calloc, Free, Realloc

Leia mais

Ponteiros. Introdução e Alocação Dinâmica

Ponteiros. Introdução e Alocação Dinâmica Ponteiros Introdução e Alocação Dinâmica Conceito Um PONTEIRO ou APONTADOR é uma variável usada para armazenar um endereço de memória. Normalmente, o endereço armazenado em um PONTEIRO é a posição de uma

Leia mais

Linguagem de Montagem Assembly

Linguagem de Montagem Assembly Linguagem de Montagem Assembly Especificações O programa em Assembly Fica sobre a camada do Sistema Operacional Efetua chamadas ao Sistema Operacional O montador Chama-se Assembler Traduz a linguagem de

Leia mais

Gerenciamento de Memória

Gerenciamento de Memória Gerenciamento de Memória Prof. Clodoaldo Ap. Moraes Lima 1 Segmentação Objetivo Melhorar o aspecto de localidade de referência em sistemas de memória virtual Em sistema paginado, os itens que são transferidos

Leia mais

ALOCAÇÃO DINÂMICA DE MEMORIA Lista 10. A linguagem C/C++ possui recursos para alocação dinâmica de memoria.

ALOCAÇÃO DINÂMICA DE MEMORIA Lista 10. A linguagem C/C++ possui recursos para alocação dinâmica de memoria. ALOCAÇÃO DINÂMICA DE MEMORIA Lista 10 A linguagem C/C++ possui recursos para alocação dinâmica de memoria. As funções que trabalham com alocação de memoria se encontram na biblioteca void *calloc(int

Leia mais

Debugging. de aplicações em C e C++

Debugging. de aplicações em C e C++ 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

Leia mais

Alocação de Memória. Lucas Ferrari de Oliveira Professor Adjunto Universidade Federal do Paraná (UFPR)

Alocação de Memória. Lucas Ferrari de Oliveira Professor Adjunto Universidade Federal do Paraná (UFPR) Alocação de Memória Linguagem de Programação Estruturada 1 Alocação dinâmica e ponteiros Lucas Ferrari de Oliveira Professor Adjunto Universidade Federal do Paraná (UFPR) Sumario Introdução Alocação Estática

Leia mais

Computadores de Programação (DCC/UFRJ)

Computadores de Programação (DCC/UFRJ) Computadores de Programação (DCC/UFRJ) Aula 14: 04 de junho de 2013 1 2 ...antigamente.. No início da Computação, todos os programas eram escritos em linguagem de montagem Complexidade, propenso a erros,

Leia mais

Alocação Estática e Dinâmica. Prof. M.Sc. Mariella Berger

Alocação Estática e Dinâmica. Prof. M.Sc. Mariella Berger Alocação Estática e Dinâmica Prof. M.Sc. Mariella Berger http://www.inf.ufes.br/~mberger mberger@inf.ufes.br mariellaberger@gmail.com Alocação Estática Estratégia de alocação de memória na qual toda a

Leia mais

Introdução à Programação Aula 04. Prof. Max Santana Rolemberg Farias Colegiado de Engenharia de Computação

Introdução à Programação Aula 04. Prof. Max Santana Rolemberg Farias Colegiado de Engenharia de Computação Introdução à Programação Aula 04 Prof. Max Santana Rolemberg Farias max.santana@univasf.edu.br Colegiado de Engenharia de Computação QUAL LINGUAGEM IREMOS ESTUDAR? 2 Introdução à Programação Linguagens

Leia mais

13. ALOCAÇÃO DINÂMICA DE MEMÓRIA

13. ALOCAÇÃO DINÂMICA DE MEMÓRIA 787878787878787878787878787878787878787878787878787878 13. ALOCAÇÃO DINÂMICA DE MEMÓRIA Sempre é necessário declarar o número de elementos do array. Mas e se ele for desconhecido? E se ele variar? Pode

Leia mais

Modulo 10 : Tipos especiais de dados: união, enumeração e...

Modulo 10 : Tipos especiais de dados: união, enumeração e... PROGRAMAÇÃO DE COMPUTADORES V - TCC- 00.323 Modulo 10 : Tipos especiais de dados: união, enumeração e... Aura - Erick aconci@ic.uff.br, erickr@id.uff.br Union Enumerações Goto, label exercicios Roteiro

Leia mais

Estruturas de Dados. Introdução Definição de Ponteiros Declaração de Ponteiros em C Manipulação de Ponteiros em C

Estruturas de Dados. Introdução Definição de Ponteiros Declaração de Ponteiros em C Manipulação de Ponteiros em C Estruturas de Dados Revisão de Ponteiros Prof. Ricardo J. G. B. Campello Sumário Introdução Definição de Ponteiros Declaração de Ponteiros em C Manipulação de Ponteiros em C Operações Ponteiros e Arranjos

Leia mais

Intel x AT&T - recapitulação

Intel x AT&T - recapitulação ASSEMBLY aula 2 Intel x AT&T - recapitulação mov mov int mov mov mov mov add lea sub Intel Code eax,1 ebx,0ffh 80h ebx, eax eax,[ecx] eax,[ebx&plus;3] eax,[ebx+20h] eax,[ebx+ecx*2h] eax,[ebx+ecx] eax,[ebx+ecx*4h-20h]

Leia mais

AULA 05: LINGUAGEM DE MONTAGEM: SUPORTE A PROCEDIMENTOS

AULA 05: LINGUAGEM DE MONTAGEM: SUPORTE A PROCEDIMENTOS ORGANIZAÇÃO E ARQUITETURA DE COMPUTADORES I AULA 05: Prof. Max Santana Rolemberg Farias max.santana@univasf.edu.br Colegiado de Engenharia de Computação O QUE SÃO PROCEDIMENTOS? Procedimentos são um conjunto

Leia mais

Segurança 2. Pedro Cruz. EEL770 Sistemas Operacionais

Segurança 2. Pedro Cruz. EEL770 Sistemas Operacionais Segurança 2 Pedro Cruz EEL770 Sistemas Operacionais Segurança da informação Propriedades da segurança da informação Quais são? Métodos de segurança Base computacional confiável Domínios de proteção Objeto

Leia mais

Uma metodologia para estudo de vulnerabilidades de BUFFER OVERFLOW

Uma metodologia para estudo de vulnerabilidades de BUFFER OVERFLOW Uma metodologia para estudo de vulnerabilidades de BUFFER OVERFLOW Francilene Coelho Cavalcante 1, Claudio de Castro Monteiro² 1 Doutorandos do Programa de Pós-Graduação em Telemática IFTO. e-mail: fulanodetal@ifto.edu.br

Leia mais

prim = A ; prim = &A[0];

prim = A ; prim = &A[0]; 57 12 - MAIS SOBRE APONTADOR 12.1 - Ponteiros e arrays Em C, ponteiros e matrizes são tratados de maneira semelhante. 12.1.1 - Nome O nome é um ponteiro, ou seja, aponta (contém o endereço) para o primeiro

Leia mais