Sei sulla pagina 1di 0

2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 1 1

Programa
Programa

o Defensiva
o Defensiva
em C
em C
Prof. Ulysses de Oliveira
Prof. Ulysses de Oliveira
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 2 2
Introdu
Introdu

o
o

Depura
Depura

o corretiva vs. depura


o corretiva vs. depura

o proativa
o proativa

Programa
Programa

o defensiva
o defensiva

Lei de Murphy da programa


Lei de Murphy da programa

o:
o:

Se um programa
Se um programa
pode
pode
apresentar bugs, eles
apresentar bugs, eles
iro se manifestar quando o programa estiver
iro se manifestar quando o programa estiver
em uso operacional
em uso operacional

Escopo e objetivos
Escopo e objetivos
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 3 3
Exemplos de Causas de Bugs Comuns
Exemplos de Causas de Bugs Comuns
char str[N];
...
gets(str);
char *s = "Bola";
...
s[0] = 'C';
1 2
char str[N];
...
printf(str);
char *s1, s2[N];
...
strcpy(s2, s1);
3 4
int F(int x)
{
if (x > 0)
return x;
}
5
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 4 4
Operadores
Operadores
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 5 5
Uso de Atribui
Uso de Atribui

o em vez de
o em vez de
Igualdade ou
Igualdade ou
Vice
Vice
-
-
versa
versa

O programador usa o operador de


O programador usa o operador de
compara
compara

o == quando deseja usar o


o == quando deseja usar o
operador de atribui
operador de atribui

o =, ou vice
o =, ou vice
-
-
versa
versa

Precau
Precau

es
es
:
:

Sempre usar constantes no lado esquerdo de


Sempre usar constantes no lado esquerdo de
expresses de compara
expresses de compara

o
o

Usar
Usar
lint
lint
e um bom compilador com
e um bom compilador com

Wall
Wall
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 6 6
Uso de Atribui
Uso de Atribui

o em vez de
o em vez de
Igualdade ou
Igualdade ou
Vice
Vice
-
-
versa
versa

Exemplos:
Exemplos:
int x;
...
if (10 = x)
...
2
int x;
...
if (x = 10)
...
1
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 7 7
Uso de Atribui
Uso de Atribui

o em vez de
o em vez de
Igualdade ou
Igualdade ou
Vice
Vice
-
-
versa
versa

Quando se juntam atribui


Quando se juntam atribui

o e teste
o e teste
numa
numa

nica expresso, deve


nica expresso, deve
-
-
se tornar
se tornar
expl
expl

cita a inten
cita a inten

o
o

Exemplo
Exemplo

melhor escrever:
melhor escrever:
if ( (p = malloc(sizeof(double))) != NULL )
...
do que:
do que:
if ( p = malloc(sizeof(double)) )
...
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 8 8
Uso Incorreto de Regras de
Uso Incorreto de Regras de
Precedncia e Associatividade
Precedncia e Associatividade

Regras que regem a ordem de aplica


Regras que regem a ordem de aplica

o
o
de operadores so facilmente esquecidas
de operadores so facilmente esquecidas
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 9 9
Uso Incorreto de Regras de
Uso Incorreto de Regras de
Precedncia e Associatividade
Precedncia e Associatividade

Exemplo
Exemplo

A inten
A inten

o do programador
o do programador

encerrar o la
encerrar o la

o
o
while
while
quando c recebe o valor
quando c recebe o valor
EOF
EOF
:
:
while (c = getc(stream) != EOF)

A expresso que acompanha


A expresso que acompanha
while
while

interpretada como:
interpretada como:
c = (getc(stream) != EOF)

Corre
Corre

o: usar parnteses
o: usar parnteses
while ((c = getc(stream)) != EOF)
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 10 10
Uso de && em vez de | | ou
Uso de && em vez de | | ou
Vice
Vice
-
-
versa
versa

Este erro muitas vezes


Este erro muitas vezes

decorrente do
decorrente do
uso equivocado das leis de
uso equivocado das leis de
De
De
Morgan:
Morgan:
EXPRESSO NEGADA EXPRESSO EQUIVALENTE
! ( A && B) ! A | | ! B
! ( A | | B) ! A && ! B
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 11 11
Uso de && em vez de | | ou
Uso de && em vez de | | ou
Vice
Vice
-
-
versa
versa

Exemplo:
Exemplo:
if ( !(x < 0 && y <= 10) )

equivalente a:
equivalente a:
if ( !(x < 0) || !(y <= 10) )
if ( x >= 0 || y > 10 )
ou a:
ou a:
Mas,
Mas,
no
no

equivalente a:
equivalente a:
if ( !(x < 0) && !(y <= 10) )
if ( x >= 0 && y > 10 )
nem
nem
a:
a:
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 12 12
Uso de & em vez de &&
Uso de & em vez de &&

Os operadores && e & no so


Os operadores && e & no so
equivalentes; e.g.:
equivalentes; e.g.:

2 && 12
2 && 12
resulta em
resulta em
1
1

2 & 12
2 & 12
resulta em
resulta em
0
0
Consulte o
Captulo 13
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 13 13
Uso de | em vez de | |
Uso de | em vez de | |

Os operadores || e | no so equivalentes;
Os operadores || e | no so equivalentes;
e.g.:
e.g.:

2 || 12
2 || 12
resulta em
resulta em
1
1

2 | 12
2 | 12
resulta em
resulta em
14
14
Consulte o
Captulo 13
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 14 14
Os Operadores L
Os Operadores L

gicos de C No So
gicos de C No So
Comutativos
Comutativos

A ordem com a qual os operandos de um


A ordem com a qual os operandos de um
operador l
operador l

gico bin
gico bin

rio so escolhidos
rio so escolhidos

importante:
importante:
x > 0 || ++y < 10
1
++y < 10 || x > 0
2
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 15 15
Os Operadores L
Os Operadores L

gicos de C No
gicos de C No
So Comutativos
So Comutativos

Exemplo
Exemplo

Este trecho de programa funciona bem:


Este trecho de programa funciona bem:
if (x > 0 && y % x)
...
Mas, se os operandos de
Mas, se os operandos de
&&
&&
forem
forem
invertidos...
invertidos...
if (y % x && x > 0)
...
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 16 16
Suposi
Suposi

es sobre Ordem de
es sobre Ordem de
Avalia
Avalia

o de Operandos
o de Operandos

Apenas quatro operadores possuem


Apenas quatro operadores possuem
ordem de avalia
ordem de avalia

o de operandos
o de operandos
definida:
definida:

&&
&&

| |
| |

? :
? :

,
,
(v
(v

rgula)
rgula)
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 17 17
Suposi
Suposi

es sobre Ordem de
es sobre Ordem de
Avalia
Avalia

o de Operandos
o de Operandos

Exemplo:
Exemplo:

Talvez, a inten
Talvez, a inten

o do programador no seja
o do programador no seja
satisfeita:
satisfeita:
int i = 0, arA[N_ELEMENTOS], arB[N_ELEMENTOS];
...
while (i < N_ELEMENTOS)
arA[i] = arB[i++];

Solu
Solu

o:
o:
while (i < N_ELEMENTOS) {
arA[i] = arB[i];
++i;
}
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 18 18
Estruturas de Controle
Estruturas de Controle
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 19 19
Uso Indevido de
Uso Indevido de
Ponto
Ponto
-
-
e
e
-
-
v
v

rgula
rgula

Exemplos:
Exemplos:
while(i > 0);
--i;
if (x > max);
max = x;
Problemas
while(i > 0){;
--i;
}
if (x > max){;
max = x;
}
Precaues
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 20 20
Instru
Instru

o
o
switch
switch
-
-
case
case
sem break
sem break

switch
switch
-
-
case
case
possui efeito cascata
possui efeito cascata

Muito raramente, este efeito


Muito raramente, este efeito

desejado
desejado

Instru
Instru

es
es
break
break
anulam o efeito cascata
anulam o efeito cascata

Quando o efeito cascata


Quando o efeito cascata

desejado, inclui
desejado, inclui
-
-
se
se
um coment
um coment

rio
rio
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 21 21
Instru
Instru

o
o
switch
switch
-
-
case
case
sem break
sem break

Exemplos:
Exemplos:
switch (opcao) {
case 1:
x = y z;
case 2:
...
default:
...
}
Falta de break acidental
ou proposital?
switch (opcao) {
case 1:
x = y z; /* Segue-se efeito cascata */
case 2:
...
default:
...
}
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 22 22
Instru
Instru

o
o
do
do
-
-
while
while
Confundida
Confundida
com REPEAT
com REPEAT
-
-
UNTIL
UNTIL

Em algumas linguagens, a estrutura


Em algumas linguagens, a estrutura
equivalente a
equivalente a
do
do
-
-
while
while
repete a
repete a
execu
execu

o do seu corpo
o do seu corpo
at
at

que
que
uma
uma
condi
condi

o seja satisfeita
o seja satisfeita

Programadores acostumados com essas


Programadores acostumados com essas
linguagens tendem a pensar que
linguagens tendem a pensar que
do
do
-
-
while
while
funciona da mesma maneira
funciona da mesma maneira
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 23 23
Instru
Instru

o
o
do
do
-
-
while
while
Confundida
Confundida
com REPEAT
com REPEAT
-
-
UNTIL
UNTIL

Exemplo em Pascal:
Exemplo em Pascal:
REPEAT
...
UNTIL (x < 0) AND (y > 10);

Transcri
Transcri

o errada em C:
o errada em C:
do {
...
} while ((x < 0) && (y > 10));

Os dois la
Os dois la

os no podem ser equivalentes!


os no podem ser equivalentes!
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 24 24
else que No Corresponde ao if
else que No Corresponde ao if
Desejado
Desejado

Um
Um
else
else
sempre corresponde ao
sempre corresponde ao
if
if
mais
mais
pr
pr

ximo que ainda no possui


ximo que ainda no possui
else
else
correspondente (mas h
correspondente (mas h

uma exce
uma exce

o...)
o...)

Exemplo:
Exemplo:
if (x == 0)
if (y == 0)
++y;
else
--x;
Casamento

Corre
Corre

o:
o:
if (x == 0) {
if (y == 0)
++y;
} else
--x;
Casamento
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 25 25
Defini
Defini

es I ncorretas de
es I ncorretas de
Fun
Fun

es
es
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 26 26
Recurso sem Fim
Recurso sem Fim

Um caso no
Um caso no
-
-
recursivo de uma fun
recursivo de uma fun

o
o
recursiva deve ser sempre atingido
recursiva deve ser sempre atingido

Exemplo
Exemplo
:
:
int Fatorial(int n)
{
if(!n || n == 1)
return 1;
return n*Fatorial(n-1);
}
E se a funo for
chamada com um
valor negativo?
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 27 27
Recurso sem Fim
Recurso sem Fim

Solu
Solu

o
o
:
:
unsigned Fatorial(int n)
{
if(n < 0)
return 0; /* Zero indica erro */
if(!n || n == 1)
return 1;
return n*Fatorial(n-1);
}
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 28 28
Retorno de Zumbis
Retorno de Zumbis

Uma fun
Uma fun

o no deve retornar o endere


o no deve retornar o endere

o
o
de uma vari
de uma vari

vel de dura
vel de dura

o autom
o autom

tica
tica

Exemplo:
Exemplo:
char* UmaFuncao1(const char *str)
{
char aux[80];
...
return aux; /* Zumbi */
}
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 29 29
Retorno de Zumbis
Retorno de Zumbis

H
H

duas solu
duas solu

es:
es:
1. Usar uma vari
1. Usar uma vari

vel de dura
vel de dura

o fixa
o fixa
:
:
char* UmaFuncao2(const char *str)
{
static char aux[80];
...
return aux; /* OK. No Zumbi */
}
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 30 30
Retorno de Zumbis
Retorno de Zumbis

H
H

duas solu
duas solu

es:
es:
2. Usar aloca
2. Usar aloca

o dinmica de mem
o dinmica de mem

ria
ria
:
:
char* UmaFuncao3(const char *str)
{
char *aux = malloc(80*sizeof(char));
...
return aux; /* OK. No Zumbi */
}
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 31 31
Fun
Fun

es sem o Devido Retorno


es sem o Devido Retorno

Exemplo:
Exemplo:
#include <stdio.h>
int F(int arg)
{
if (arg > 0)
return arg;
}
int main(void)
{
printf( "\nValor retornado por F(10): %d\n",
F(10));
printf( "Valor retornado por F(-10): %d\n",
F(-10));
return 0;
}
O que ocorre, quando esta
funo chamada com um
parmetro negativo?
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 32 32
Vazamento de Mem
Vazamento de Mem

ria
ria

Se uma fun
Se uma fun

o retorna sem liberar um


o retorna sem liberar um
bloco alocado dinamicamente, ele ser
bloco alocado dinamicamente, ele ser

perdido:
perdido:
void F(const char *str)
{
char *p = malloc(strlen(str) + 1);
... /* Algum processamento */
/* com o bloco alocado */
}
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 33 33
Chamadas Incorretas de
Chamadas Incorretas de
Fun
Fun

es
es
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 34 34
Suposi
Suposi

es sobre Ordem de
es sobre Ordem de
Avalia
Avalia

o de Parmetros
o de Parmetros

O resultado de uma chamada de fun


O resultado de uma chamada de fun

o
o
no deve depender da ordem na qual os
no deve depender da ordem na qual os
parmetros so avaliados
parmetros so avaliados
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 35 35
Suposi
Suposi

es sobre Ordem de Avalia


es sobre Ordem de Avalia

o
o
de Parmetros
de Parmetros

Exemplo
Exemplo

Efeito da ordem de empilhamento de parmetros


Efeito da ordem de empilhamento de parmetros
#include <stdio.h>
#include <string.h>
void ImprimeInts(int x, int y)
{
printf("\n\tPrimeiro valor: %d", x);
printf("\n\tSegundo valor: %d", y);
}
int main(void)
{
int x = 10;
ImprimeInts( x, ++x );
putchar('\n');
return 0;
}
Resultado quando o empilhamento
da direita para a esquerda:
Primeiro valor: 11
Segundo valor: 11
Resultado quando o empilhamento
da esquerda para a direita:
Primeiro valor: 10
Segundo valor: 11
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 36 36
Omisso de Teste de Condi
Omisso de Teste de Condi

o de
o de
Exce
Exce

o
o

Toda fun
Toda fun

o que retorna valor indicando


o que retorna valor indicando
ocorrncia de erro deve ter seu valor de
ocorrncia de erro deve ter seu valor de
retorno testado
retorno testado

Fun
Fun

es not
es not

veis nesta categoria:


veis nesta categoria:

malloc()
malloc()
,
,
calloc()
calloc()
e
e
realloc()
realloc()

fopen()
fopen()
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 37 37
Omisso de Teste de Condi
Omisso de Teste de Condi

o de
o de
Exce
Exce

o
o

Exemplo
Exemplo

em vez de usar:
em vez de usar:
FILE *stream = fopen("UmArquivo.txt", "r");
...
fgets(array, sizeof(array), stream);
Use:
Use:
FILE *stream;
...
if ((stream = fopen("UmArquivo.txt", "r")) != NULL)
if (fgets(array, sizeof(array), stream))
...
else
...
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 38 38
Omisso de Teste de Condi
Omisso de Teste de Condi

o de
o de
Exce
Exce

o
o

Algumas fun
Algumas fun

es sinalizam a ocorrncia
es sinalizam a ocorrncia
de erro por meio da vari
de erro por meio da vari

vel
vel
errno
errno

Deve
Deve
-
-
se checar se o valor desta vari
se checar se o valor desta vari

vel
vel
foi alterado ap
foi alterado ap

s a chamada de uma
s a chamada de uma
dessas fun
dessas fun

es
es
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 39 39
Omisso de Teste de Condi
Omisso de Teste de Condi

o de
o de
Exce
Exce

o
o

Exemplo
Exemplo

em vez de escrever:
em vez de escrever:
Deve
Deve
-
-
se escrever:
se escrever:
double y;
...
y = sqrt(x);
printf("Valor de y = %f", y);
E se x for
negativo?
Suponha que x
represente
uma expresso
complexa
double y;
...
errno = 0;
y = sqrt(x);
if (!errno) /* No ocorreu erro */
printf("Valor de y = %f", y);
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 40 40
Omisso de Teste em Aloca
Omisso de Teste em Aloca

o
o
Dinmica de Mem
Dinmica de Mem

ria
ria

O uso de uma macro pode facilitar a


O uso de uma macro pode facilitar a
tarefa se o programa deve reagir sempre
tarefa se o programa deve reagir sempre
de uma certa maneira quando no
de uma certa maneira quando no

poss
poss

vel alocar espa


vel alocar espa

o
o
Macro ASSEGURA_MALLOC
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 41 41
Implementa
Implementa

es Incorretas da
es Incorretas da
Biblioteca Padro
Biblioteca Padro

Algumas implementa
Algumas implementa

es de fun
es de fun

es da
es da
biblioteca padro no seguem as
biblioteca padro no seguem as
especifica
especifica

es do padro ISO de C
es do padro ISO de C

Exemplos em verses recentes de


Exemplos em verses recentes de
glib
glib
:
:
snprintf()
snprintf()
e
e
vsnprintf()
vsnprintf()

Sugesto
Sugesto
: consulte
: consulte
FAQs
FAQs
, newsgroups,
, newsgroups,
etc.
etc.
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 42 42
Chamadas de Fun
Chamadas de Fun

es sem
es sem
Parmetros
Parmetros

Em algumas linguagens, uma fun


Em algumas linguagens, uma fun

o sem
o sem
parmetros
parmetros

chamada usando
chamada usando
-
-
se apenas
se apenas
seu nome
seu nome

Em C,
Em C,

legal usar isoladamente o nome de


legal usar isoladamente o nome de
uma fun
uma fun

o definida com ou sem


o definida com ou sem
parmetros:
parmetros:
void UmaFuncaoSemParametros()
{
...
}
...
UmaFuncaoSemParametros;
Legal, mas intil
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 43 43
Entrada e Sa
Entrada e Sa

da
da
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 44 44
Uso Incorreto de scanf()
Uso Incorreto de scanf()

Erro comuns:
Erro comuns:
1.
1.
Passar vari
Passar vari

vel (em vez de endere


vel (em vez de endere

o) como
o) como
argumento
argumento
2.
2.
No checar o valor retornado
No checar o valor retornado
3.
3.
Especificador de formato e tipo de vari
Especificador de formato e tipo de vari

vel
vel
que no casam
que no casam
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 45 45
Uso Incorreto de scanf()
Uso Incorreto de scanf()

Exemplo
Exemplo
:
:
int x;
...
scanf("%d", x);
Deveria ser &x

Resultado
Resultado
: aborto ou erro l
: aborto ou erro l

gico
gico
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 46 46
Uso Incorreto de scanf()
Uso Incorreto de scanf()

Exemplo
Exemplo
:
:
#include <stdio.h>
int main(void)
{
int i;
char c;
for (i = 0; i < 5; ++i) {
fprintf(stderr, "Digite um inteiro: ");
scanf("%d", &c);
printf ("Valor de i: %d\n", i);
}
return 0;
}
Exemplo de Execuo
Digite um inteiro: 1
Valor de i: 0
Digite um inteiro: 2
Valor de i: 0
Digite um inteiro: 3
Valor de i: 0
Digite um inteiro: ^C
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 47 47
Uso Incorreto de printf()
Uso Incorreto de printf()

O famoso bug de printf:


O famoso bug de printf:
#include <stdio.h>
int main(int argc, char *argv[])
{
if (2 != argc) {
printf( "\nUso do programa:\n"
" %s <string>\n", argv[0]);
return 1;
}
printf(argv[1]);
return 0;
}
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 48 48
Uso Incorreto de printf()
Uso Incorreto de printf()

Bug de printf
Bug de printf

Quando o usu
Quando o usu

rio digita especificadores de


rio digita especificadores de
formato:
formato:
$ ./printfBug "%X %X %X %X %X %X"
o resultado impresso pode ser:
o resultado impresso pode ser:
3E2480 3E2AE0 4012B5 77C1AEAD 1A 22FFA8

Um
Um
hacker
hacker
ainda pode escrever na pilha
ainda pode escrever na pilha
usando
usando
%n
%n
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 49 49
Uso Incorreto de printf()
Uso Incorreto de printf()

Modo seguro de imprimir strings com


Modo seguro de imprimir strings com
printf()
printf()
:
:
printf("%s", str); /* Seguro */
Nunca imprima strings assim:
Nunca imprima strings assim:
printf(str); /* Inseguro! */
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 50 50
String de Formata
String de Formata

o Incorreto
o Incorreto

Confuses entre especificadores usados


Confuses entre especificadores usados
para tipos de ponto flutuante:
para tipos de ponto flutuante:
ESPECIFICADOR DE
FORMATO PARA O TIPO...
FAMLIA float double
Printf
f
Scanf
f lf
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 51 51
String de Formata
String de Formata

o Incorreto
o Incorreto

Outros especificadores frequentemente


Outros especificadores frequentemente
confundidos:
confundidos:

unsigned long
unsigned long

%lu
%lu
(e no
(e no
%
%
ul
ul
)
)

unsigned long
unsigned long
long
long

%llu
%llu
(e no
(e no
%
%
ull
ull
)
)
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 52 52
Lixo no Buffer Associado
Lixo no Buffer Associado

Entrada
Entrada
Padro
Padro

A principal causa de problemas: deixar


A principal causa de problemas: deixar
caracteres remanescentes de uma leitura
caracteres remanescentes de uma leitura
no buffer associado
no buffer associado

entrada padro
entrada padro

Solu
Solu

o: fun
o: fun

o
o
LimpaBuffer
LimpaBuffer
()
()
Consulte o
Captulo 2
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 53 53
No Existe Uso Correto para gets()
No Existe Uso Correto para gets()

A fun
A fun

o
o
gets()
gets()
no permite limitar o
no permite limitar o
n
n

mero de caracteres lidos; e.g.:


mero de caracteres lidos; e.g.:
char str[UINT_MAX];
...
gets(str);
O usurio sempre
pode digitar mais

Solu
Solu

o
o
: Usar de
: Usar de
fgets()
fgets()
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 54 54
Uso Incorreto de EOF
Uso Incorreto de EOF

Macro
Macro
EOF
EOF

Deve ser usada apenas para arquivos abertos


Deve ser usada apenas para arquivos abertos
em modo texto
em modo texto

Muitos programadores no sabem como us


Muitos programadores no sabem como us

-
-
la para determinar final de arquivo; e.g.:
la para determinar final de arquivo; e.g.:
char c;
FILE *stream;
...
while ((c = fgetc(stream)) != EOF)
putchar(c);
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 55 55
Uso Incorreto de EOF
Uso Incorreto de EOF

Sugesto
Sugesto
: use
: use
feof()
feof()
FILE *streamEntrada;
char c;
...
while (1) {
c = getc(streamEntrada);
...
if ( feof(streamEntrada) )
break;
...
}
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 56 56
Uso Incorreto de feof()
Uso Incorreto de feof()

feof()
feof()
retorna um valor diferente de zero
retorna um valor diferente de zero
ap
ap

s uma tentativa de leitura al


s uma tentativa de leitura al

m do
m do
final de um stream
final de um stream

Exemplo de uso incorreto de


Exemplo de uso incorreto de
feof()
feof()
:
:
while ( !feof(Entrada) )
putc(getc(Entrada), Saida);
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 57 57
Pr
Pr

-
-
processador
processador
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 58 58
Defini
Defini

es de Tipos Usando #define


es de Tipos Usando #define

Nunca use
Nunca use
#define
#define
para definir tipos:
para definir tipos:
#define tPonteiroParaChar char *
...
tPonteiroParaChar p1, p2;
Expanso
char * p1, p2;

Corre
Corre

o:
o:
typedef tPonteiroParaChar char *
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 59 59
Defini
Defini

es Incorretas de Macros
es Incorretas de Macros

Erros
Erros
frequentes
frequentes
em defini
em defini

es de
es de
macros:
macros:

Uso de ponto
Uso de ponto
-
-
e
e
-
-
v
v

rgula ao final da
rgula ao final da
defini
defini

o
o

Falta de parnteses em torno de


Falta de parnteses em torno de
cada argumento
cada argumento

Falta de parnteses em torno de uma


Falta de parnteses em torno de uma
expresso no corpo da macro
expresso no corpo da macro

Uso repetido de argumentos no


Uso repetido de argumentos no
corpo da macro
Consulte o
Captulo 5
corpo da macro
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 60 60
Chamadas Incorretas de Macros
Chamadas Incorretas de Macros

Uma macro no deve ser invocada usando


Uma macro no deve ser invocada usando
argumento sob a
argumento sob a

o de um operador com
o de um operador com
efeito colateral
efeito colateral
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 61 61
Ponteiros
Ponteiros
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 62 62
Ponteiros No
Ponteiros No
-
-
iniciados
iniciados

Sintomas apresentados por um programa


Sintomas apresentados por um programa
que usa um ponteiro no
que usa um ponteiro no
-
-
iniciado:
iniciado:

O programa
O programa

abortado enquanto executa


abortado enquanto executa
uma fun
uma fun

o sem
o sem
bugs
bugs

Uma fun
Uma fun

o
o

chamada, mas no inicia sua


chamada, mas no inicia sua
execu
execu

o ou no retorna
o ou no retorna

O programa ora funciona corretamente ora


O programa ora funciona corretamente ora
no funciona
no funciona

Muitos outros (dependendo do SO)


Muitos outros (dependendo do SO)
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 63 63
Ponteiros No
Ponteiros No
-
-
iniciados
iniciados

Antes de usar qualquer ponteiro,


Antes de usar qualquer ponteiro,
pergunte
pergunte
-
-
se:
se:
Para qual vari
Para qual vari

vel esse
vel esse
ponteiro est
ponteiro est

apontando agora?
apontando agora?

Exemplo:
Exemplo:
strcpy(str, "bola");
Para onde str est
apontando agora?
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 64 64
Ponteiros
Ponteiros

rfos
rfos

Um ponteiro
Um ponteiro

rfo aponta para um endere


rfo aponta para um endere

o
o
"v
"v

lido", mas o espa


lido", mas o espa

o associado est
o associado est

livre para
livre para
aloca
aloca

o a qualquer instante (zumbi)


o a qualquer instante (zumbi)

Zumbis tamb
Zumbis tamb

m ocorrem em situa
m ocorrem em situa

es que no
es que no
envolvem retorno de fun
envolvem retorno de fun

es:
es:
int *p = NULL;
...
{
int x = 10;
p = &x;
}
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 65 65
Ponteiros
Ponteiros

rfos
rfos

Exemplo:
Exemplo:
int p1 = malloc(sizeof(int));
int p2 = p1;
...
free(p1);
Tanto p1 quanto p2
tornam-se rfos
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 66 66
Ponteiros
Ponteiros

rfos
rfos

Macro FREE():
Macro FREE():

Chama
Chama
free()
free()
e anula o ponteiro usado como
e anula o ponteiro usado como
argumento
argumento

Torna um poss
Torna um poss

vel erro l
vel erro l

gico em erro de
gico em erro de
execu
execu

o
o

Mas no
Mas no

uma panac
uma panac

ia; e.g.:
ia; e.g.:
int p1 = malloc(sizeof(int));
int p2 = p1;
...
FREE(p1);
*p1 = 10; /* Programa abortado */
...
*p2 = 0; /* Talvez um erro lgico */
Consulte o
Captulo 11
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 67 67
Ponteiros
Ponteiros

rfos
rfos

Quando se tm dois ponteiros apontando


Quando se tm dois ponteiros apontando
para um mesmo espa
para um mesmo espa

o alocado
o alocado
dinamicamente, no se deve chamar
dinamicamente, no se deve chamar
free()
free()
para cada ponteiro
para cada ponteiro
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 68 68
Ponteiro Incrementado Passa a
Ponteiro Incrementado Passa a
Apontar para Outro Endere
Apontar para Outro Endere

o
o

At
At

programadores experientes esquecem


programadores experientes esquecem
o
o

bvio
bvio

Exemplo:
Exemplo:
char *Copia(char *destino, const char *origem)
{
while (*destino++ = *origem++)
; /* Intencionalmente vazio */
return destino;
}
Para onde estar apontando
o ponteiro destino?
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 69 69
Indire
Indire

o
o
de Ponteiro Nulo
de Ponteiro Nulo

Algumas fun
Algumas fun

es de biblioteca aplicam o
es de biblioteca aplicam o
operador de
operador de
indire
indire

o
o
a um ponteiro
a um ponteiro
recebido como argumento
recebido como argumento

Exemplo:
Exemplo:
#include <stdio.h>
#include <string.h>
int main(void)
{
char *p = NULL, ar[10];
strcpy(ar, p);
return 0;
}
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 70 70
Arrays e Strings
Arrays e Strings
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 71 71
Desrespeito aos Limites de Arrays
Desrespeito aos Limites de Arrays

Desrespeitar os limites de um array ocorre


Desrespeitar os limites de um array ocorre
com frequncia em la
com frequncia em la

os de repeti
os de repeti

o
o

Exemplo:
Exemplo:
#include <stdio.h>
int main(void)
{
int ar[5], i;
for (i = 1; i <= 5; ++i) {
ar[i] = 1;
printf("ar[%d] = %d\n", i, ar[i]);
}
return 0;
}
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 72 72
Desrespeito aos Limites de Arrays
Desrespeito aos Limites de Arrays

Se uma vari
Se uma vari

vel definida logo antes ou


vel definida logo antes ou
depois de um array assumir valores
depois de um array assumir valores
inesperados, suspeite de acesso indevido
inesperados, suspeite de acesso indevido
ao array; e.g.:
ao array; e.g.:
int i;
float ar[10];
double d;
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 73 73
Strings Constantes Devem Ser
Strings Constantes Devem Ser
Considerados Constantes
Considerados Constantes

Strings constantes podem ser


Strings constantes podem ser
armazenados em mem
armazenados em mem

ria usada apenas


ria usada apenas
para leitura
para leitura

Sugesto
Sugesto
: declare ponteiros para strings
: declare ponteiros para strings
constantes com
constantes com
const
const
; e.g.:
; e.g.:
const char *s = "Bola";
...
*s = 'C';
O compilador
aponta o erro
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 74 74
Compara
Compara

o Incorreta de Strings
o Incorreta de Strings

Exemplo:
Exemplo:
char *s1 = "bola";
char s2[] = "bola";
...
if (s1 == s2)
printf("s1 e s2 sao iguais");

Para determinar se dois strings so iguais,


Para determinar se dois strings so iguais,
use:
use:

strcmp()
strcmp()
ou
ou

strncmp()
strncmp()
ou
ou

memcmp()
memcmp()
[nem sempre
[nem sempre

conveniente]
conveniente]
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 75 75
Compara
Compara

o Incorreta de Strings
o Incorreta de Strings

Para ordenar strings, use:


Para ordenar strings, use:

strcoll()
strcoll()
ou
ou

strxfrm()
strxfrm()
em conjunto com
em conjunto com
strcmp()
strcmp()
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 76 76
Strings Constantes sem
Strings Constantes sem
Acessibilidade
Acessibilidade

Quando se atribui um string constante a


Quando se atribui um string constante a
um ponteiro, este torna
um ponteiro, este torna
-
-
se o
se o

nico meio
nico meio
de acesso ao string
de acesso ao string

Se o ponteiro de acesso for associado a


Se o ponteiro de acesso for associado a
outro endere
outro endere

o, ocorre vazamento de
o, ocorre vazamento de
mem
mem

ria; e.g.:
ria; e.g.:
char *p = "pitomba";
...
p = "caju";
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 77 77
Uso de sizeof em vez de strlen()
Uso de sizeof em vez de strlen()

sizeof
sizeof
no deve ser usado em
no deve ser usado em
substitui
substitui

o a
o a
strlen()
strlen()
:
:
char *p = "bola";
char s1[80] = "bola";
char s2[] = "bola";
size_t tamanhoStr;
...
tamanhoStr = sizeof(p);
tamanhoStr = sizeof(s1);
tamanhoStr = sizeof(s2);
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 78 78
Fun
Fun

es que No Limitam o
es que No Limitam o
N
N

mero de Caracteres Escritos


mero de Caracteres Escritos

Muitas fun
Muitas fun

es de processamento de
es de processamento de
strings no limitam o n
strings no limitam o n

mero de
mero de
caracteres escritos num array
caracteres escritos num array

Sugesto
Sugesto
: use fun
: use fun

es equivalentes que
es equivalentes que
possuem essa capacidade
possuem essa capacidade
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 79 79
Fun
Fun

es que No Limitam o
es que No Limitam o
N
N

mero de Caracteres Escritos


mero de Caracteres Escritos

Exemplo
Exemplo

em vez de usar
em vez de usar
strcpy()
strcpy()
:
:
char s[10];
...
strcpy(s, "um longo string que corrompe memoria");
Use
Use
strncpy()
strncpy()
:
:
char s[10];
...
strncpy(s, "um longo string que corrompe memoria",
sizeof(s));
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 80 80
Fun
Fun

es que Nem Sempre


es que Nem Sempre
Produzem Strings
Produzem Strings

Algumas fun
Algumas fun

es declaradas em
es declaradas em
<string.h> ou <stdio.h> nem sempre
<string.h> ou <stdio.h> nem sempre
incluem o caractere terminal de string nos
incluem o caractere terminal de string nos
resultados de opera
resultados de opera

es com strings
es com strings
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 81 81
Fun
Fun

es que Nem Sempre


es que Nem Sempre
Produzem Strings
Produzem Strings

Exemplo
Exemplo
#include <stdio.h>
#include <string.h>
#define TAMANHO 12
int main()
{
char str[TAMANHO];
strncpy(str, "Um string grande", TAMANHO);
printf( "String apos chamada de strncpy():"
"\n\t \"%s\"\n", str );
return 0;
}
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 82 82
Strings Constantes Versus
Strings Constantes Versus
Caracteres Constantes
Caracteres Constantes

Erros
Erros
frequentes
frequentes
cometidos por iniciantes
cometidos por iniciantes
quando lidam com caracteres isolados e
quando lidam com caracteres isolados e
strings:
strings:
char *p;
...
*p = "A";
...
p = 'A';
ERRADO
ERRADO
char *p = "A"; OK
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 83 83
Aloca
Aloca

o de Espa
o de Espa

o Insuficiente
o Insuficiente
para Conter um String
para Conter um String

Arrays usados para armazenar resultados


Arrays usados para armazenar resultados
de opera
de opera

es com strings devem ter


es com strings devem ter
tamanhos suficientemente grandes:
tamanhos suficientemente grandes:
char *p;
...
strcpy(p, "Bola");
Para onde p aponta?
1
char *p = malloc(strlen("Bola"));
...
strcpy(p, "Bola");
p aponta para espao suficiente?
2
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 84 84
Aloca
Aloca

o Dinmica de
o Dinmica de
Mem
Mem

ria
ria
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 85 85
Zumbis Tamb
Zumbis Tamb

m Assombram o
m Assombram o
Heap
Heap

Se uma fun
Se uma fun

o aloca mem
o aloca mem

ria e retorna o
ria e retorna o
endere
endere

o do bloco alocado, ela no deve


o do bloco alocado, ela no deve
chamar
chamar
free()
free()
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 86 86
Zumbis Tamb
Zumbis Tamb

m Assombram o
m Assombram o
Heap
Heap

Exemplo:
Exemplo:
char *Funcao1(const char *str)
{
char *p = malloc(strlen(str) + 1);
...
free(p);
return p;
}
char *Funcao2(const char *str)
{
char *pAux = Funcao2("Boi");
...
free(pAux);
}
CORRETO
ERRADO
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 87 87
Lista Encadeada No
Lista Encadeada No

Array
Array

Elementos de uma lista encadeada no


Elementos de uma lista encadeada no
so adjacentes e no devem ser
so adjacentes e no devem ser
acessados por meio de
acessados por meio de

ndices ou
ndices ou
incrementos de ponteiros:
incrementos de ponteiros:
p = p->proximo; /* Correto */
p++; /* ERRADO */
++p; /* ERRADO */
p[2]; /* ERRADO */
p um ponteiro
para um n de uma
lista encadeada
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 88 88
Opera
Opera

es Inteiras
es Inteiras
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 89 89
Overflow
Overflow

Uma opera
Uma opera

o inteira resultar
o inteira resultar

em
em
overflow se, considerando os operandos
overflow se, considerando os operandos
como
como
unsigned
unsigned
, o resultado for negativo:
, o resultado for negativo:
int x, y;
...
if ((int)((unsigned)x + (unsigned)y) < 0)
printf("Ocorrera' overflow");
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 90 90
Opera
Opera

es de Ponto
es de Ponto
Flutuante
Flutuante
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 91 91
Arredondamentos
Arredondamentos

Uma opera
Uma opera

o de ponto flutuante pode


o de ponto flutuante pode
no resultar no valor esperado devido a
no resultar no valor esperado devido a
arredondamento
arredondamento
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 92 92
Arredondamentos
Arredondamentos

Exemplos (
Exemplos (
x
x

do tipo
do tipo
double
double
):
):
x = pow(10, 40) +
700 -
pow(10, 40) +
pow(10, 45) +
500 -
pow(10, 45);
x receber 0
x = pow(10, 40) -
pow(10, 40) +
pow(10, 45) -
pow(10, 45) +
700 +
500;
x receber 200

Usar
Usar
long double
long double
no melhora a situa
no melhora a situa

o
o
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 93 93
Compara
Compara

es de Ponto Flutuante
es de Ponto Flutuante

N
N

meros de ponto flutuante no devem


meros de ponto flutuante no devem
ser comparados usando o operador de
ser comparados usando o operador de
igualdade
igualdade
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 94 94
Compara
Compara

es de Ponto Flutuante
es de Ponto Flutuante

Exemplo
Exemplo

e
e
m vez de usar:
m vez de usar:
double x, y;
...
if (x == y)
...
Use:
Use:
#define DELTA 0.000001
...
double x, y;
...
if ( fabs(x y) <= DELTA )
...
Depende da
preciso desejada
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 95 95
Overflow e Underflow de Ponto
Overflow e Underflow de Ponto
Flutuante
Flutuante

Overflow e underflow podem ser


Overflow e underflow podem ser
detectados ap
detectados ap

s ocorrerem:
s ocorrerem:
double umDouble = 2*DBL_MAX;
...
if (umDouble == HUGE_VAL)
printf ("\nOcorreu overflow\n");
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 96 96
Erros de Portabilidade
Erros de Portabilidade
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 97 97
Erro de Portabilidade
Erro de Portabilidade

O programa
O programa

executado numa dada


executado numa dada
implementa
implementa

o de C, mas no em outra
o de C, mas no em outra

Erros de portabilidade comuns:


Erros de portabilidade comuns:

void main()
void main()

fflush(stdin)
fflush(stdin)

conio
conio
.h
Portabilidade
discutida em
detalhes no
Volume II de:
.h
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 98 98
void main()
void main()

O padro ISO de C especifica dois


O padro ISO de C especifica dois
prot
prot

tipos para
tipos para
main()
main()
:
:
int main(void)
int main(int argc, char *argv[])

Em ambos os prot
Em ambos os prot

tipos, o tipo de retorno


tipos, o tipo de retorno

int
int
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 99 99
fflush(stdin)
fflush(stdin)

fflush()
fflush()
serve para descarregar apenas
serve para descarregar apenas
buffers associados a streams de sa
buffers associados a streams de sa

da
da

Erro comum:
Erro comum:

fflush(stdin)
fflush(stdin)

Solu
Solu

o
o
: implementar
: implementar
LimpaBuffer
LimpaBuffer
()
()
Consulte o
Captulo 2
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 100 100
conio
conio
.h
.h

Extenso comum entre implementa


Extenso comum entre implementa

es
es
de C
de C

Fun
Fun

es mais utilizadas:
es mais utilizadas:

getch
getch
()
()

getche
getche
()
()

clrscr
clrscr
()
()

gotoxy
gotoxy
()
()
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 101 101
Concluso
Concluso
2009, Ulysses de Oliveira 2009, Ulysses de Oliveira Programa Programa o Defensiva em C o Defensiva em C 102 102
Concluso
Concluso

Outros erros comuns de programa


Outros erros comuns de programa

o em
o em
C:
C:

Apndice D
Apndice D
do
do
Volume II
Volume II
de
de
Programando
Programando
em C
em C
(
(
coming soon
coming soon

)
)

Depura
Depura

o e programa
o e programa

o defensiva so
o defensiva so
temas complexos
temas complexos
Any questions

Potrebbero piacerti anche