Você está na página 1de 0

Programaççãoão Defensiva

Programa

Defensiva

emem CC

Prof. Ulysses

Prof.

Ulysses dede Oliveira

Oliveira

©© 2009,

2009, Ulysses

Ulysses de

de Oliveira

Oliveira –– Programa

Programaççãoão Defensiva

Defensiva emem CC

11

Introdu Introduççãoão

Depura Depuraççãoão corretiva corretiva vs. vs. depura depuraççãoão proativa proativa

Programa Programaççãoão defensiva

defensiva

Lei Lei dede Murphy

Murphy dada programa

programaçção:

ão:

•• SeSe umum programa

programa pode

pode apresentar

apresentar bugs,

bugs, eles

eles

irão sese manifestar

irão

manifestar quando

quando oo programa

programa estiver

estiver

uso operacional

operacional

emem uso

Escopo Escopo ee objetivos

objetivos

©© 2009,

2009, Ulysses

Ulysses de

de Oliveira

Oliveira –– Programa

Programaççãoão Defensiva

Defensiva emem CC

22

Exemplos dede Causas

Exemplos

Causas dede Bugs

Bugs Comuns

Comuns

1
1

char str[N]; ... gets(str);

char *s = "Bola"; ... s[0] = 'C';

2
2

3

char str[N]; ... printf(str);

char *s1, s2[N]; ... strcpy(s2, s1);

4
4
5
5

int F(int x) {

if (x > 0) return x;

}

©© 2009,

2009, Ulysses

Ulysses de

de Oliveira

Oliveira –– Programa

Programaççãoão Defensiva

Defensiva emem CC

33

Operadores

Operadores

©© 2009,

2009, Ulysses

Ulysses de

de Oliveira

Oliveira –– Programa

Programaççãoão Defensiva

Defensiva emem CC

44

Uso dede Atribui

Uso

Atribuiççãoão emem vez

vez dede

Igualdade

Igualdade ouou Vice

Vice--versa

versa

OO programador

programador usa

usa oo operador

operador dede

comparaççãoão ==== quando

compara

quando deseja

deseja usar

usar oo

operador dede atribui

operador

atribuiççãoão =,

=, ouou vice

vice--versa

versa

Precau Precauçções

ões::

•• Sempre

Sempre usar

usar constantes

constantes nono lado

lado esquerdo

esquerdo dede

expressões dede compara

expressões

comparaççãoão

•• Usar

Usar lint

lint ee umum bom

bom compilador

compilador com

com ––Wall Wall

©© 2009,

2009, Ulysses

Ulysses de

de Oliveira

Oliveira –– Programa

Programaççãoão Defensiva

Defensiva emem CC

55

Uso dede Atribui

Uso

Atribuiççãoão emem vez

vez dede

Igualdade

Igualdade ouou Vice

Vice--versa

versa

Exemplos: Exemplos:

  • 1

  • 2

int x; ... if (x = 10) ...

int x; ... if (10 = x) ...

©© 2009,

2009, Ulysses

Ulysses de

de Oliveira

Oliveira –– Programa

Programaççãoão Defensiva

Defensiva emem CC

66

Uso dede Atribui

Uso

Atribuiççãoão emem vez

vez dede

Igualdade

Igualdade ouou Vice

Vice--versa

versa

Quando Quando sese juntam

juntam atribui

atribuiççãoão ee teste

teste

numa úúnica

numa

nica expressão,

expressão, deve

deve--sese tornar

tornar

explíícita

expl

cita aa inten

intenççãoão

•• Exemplo

Exemplo –– éé melhor

melhor escrever:

escrever:

if ( (p = malloc(sizeof(double))) != NULL ) ...

dodo que:

que:

if ( p = malloc(sizeof(double)) ) ...

©© 2009,

2009, Ulysses

Ulysses de

de Oliveira

Oliveira –– Programa

Programaççãoão Defensiva

Defensiva emem CC

77

Uso Incorreto

Uso

Incorreto dede Regras

Regras dede

Precedência ee Associatividade

Precedência

Associatividade

Regras Regras que

regem aa ordem

ordem dede aplica

que regem

aplicaççãoão

dede operadores

operadores são

são facilmente

facilmente esquecidas

esquecidas

©© 2009,

2009, Ulysses

Ulysses de

de Oliveira

Oliveira –– Programa

Programaççãoão Defensiva

Defensiva emem CC

88

Uso Incorreto

Uso

Incorreto dede Regras

Regras dede

Precedência ee Associatividade

Precedência

Associatividade

Exemplo Exemplo

•• AA inten

intenççãoão dodo programador

programador éé encerrar

encerrar oo lalaççoo

while quando

while

quando cc recebe

recebe oo valor

valor EOF

EOF::

while (c = getc(stream) != EOF)

•• AA expressão

expressão que

que acompanha

acompanha while

while éé

interpretada

interpretada como:

como:

c = (getc(stream) != EOF)

•• Corre

Correçção:

ão: usar

usar parênteses

parênteses

while ((c = getc(stream)) != EOF)

©© 2009,

2009, Ulysses

Ulysses de

de Oliveira

Oliveira –– Programa

Programaççãoão Defensiva

Defensiva emem CC

99

Uso dede &&&& emem vez

Uso

vez dede |||| ouou Vice

Vice--

versa

versa

Este Este erro

erro muitas

muitas vezes

vezes éé decorrente

decorrente dodo

uso equivocado

uso

equivocado das

das leis

leis dede De

De Morgan:

Morgan:

EXPRESSÃO NEGAD A

EXPRESSÃO EQUIVALENTE

!(A && B)

!A || !B

!(A || B)

!A && !B

©© 2009,

2009, Ulysses

Ulysses de

de Oliveira

Oliveira –– Programa

Programaççãoão Defensiva

Defensiva emem CC

1010

Uso dede &&&& emem vez

Uso

vez dede |||| ouou Vice

Vice--

versa

versa

Exemplo: Exemplo:

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

éé equivalente

equivalente a:

a:

if ( !(x < 0) || !(y <= 10) )

ouou a: a: if ( x >= 0 || y > 10 ) Mas, Mas, não
ouou a:
a:
if ( x >= 0 ||
y
> 10 )
Mas,
Mas, não
não éé equivalente
equivalente a:
a:
if ( !(x < 0) && !(y <= 10) )
nem
nem a:
a:
if ( x >= 0 && y > 10 )
©© 2009,
2009, Ulysses
Ulysses de
de Oliveira
Oliveira –– Programa
Programaççãoão Defensiva
Defensiva emem CC
1111

Uso dede && emem vez

Uso

vez dede &&&&

Os Os operadores

operadores &&&& ee && não

não são

são

equivalentes;

equivalentes; e.g.:

e.g.:

•• 22 &&&& 1212 resulta

resulta emem 11

•• 22 && 1212 resulta resulta emem 00

Consulte o Capítulo 13

de de & & em em vez Uso de de && && Os operadores &&&&

©© 2009,

2009, Ulysses

Ulysses de

de Oliveira

Oliveira –– Programa

Programaççãoão Defensiva

Defensiva emem CC

de de & & em em vez Uso de de && && Os operadores &&&&

1212

Uso dede || emem vez

Uso

vez dede ||||

Os Os operadores

operadores |||| ee || não

não são

são equivalentes;

equivalentes;

e.g.:

e.g.:

•• 22

|||| 1212 resulta

resulta emem 11

•• 22

||

1212 resulta

resulta emem 1414

Consulte o Capítulo 13

de de | | em em vez Uso de de || || Os operadores ||||

©© 2009,

2009, Ulysses

Ulysses de

de Oliveira

Oliveira –– Programa

Programaççãoão Defensiva

Defensiva emem CC

de de | | em em vez Uso de de || || Os operadores ||||

1313

Os Operadores

Os

Operadores LLóógicos

gicos dede CC Não

Não São

São

Comutativos

Comutativos

AA ordem

ordem com

com aa qual

qual os

os operandos

operandos dede umum

operador

operador llóógico

gico bin

binááriorio são

são escolhidos

escolhidos éé

importante:

importante:

x > 0 || ++y < 10

1
1
 

++y < 10 || x > 0

2
2

©© 2009,

2009, Ulysses

Ulysses de

de Oliveira

Oliveira –– Programa

Programaççãoão Defensiva

Defensiva emem CC

1414

Os Operadores

Os

Operadores LLóógicos

gicos dede CC Não

Não

São Comutativos

São

Comutativos

Exemplo Exemplo

•• Este

Este trecho

trecho dede programa

programa funciona

funciona bem:

bem:

if (x > 0 && y % x) ...

Mas,

Mas, sese os

os operandos

operandos dede &&&& forem

forem

invertidos ...

invertidos ...

if (y % x && x > 0) ...

©© 2009,

2009, Ulysses

Ulysses de

de Oliveira

Oliveira –– Programa

Programaççãoão Defensiva

Defensiva emem CC

1515

Suposi

Suposiçções

ões sobre

sobre Ordem

Ordem dede

Avaliaççãoão dede Operandos

Avalia

Operandos

Apenas Apenas quatro

quatro operadores

operadores possuem

possuem

ordem dede avalia

ordem

avaliaççãoão dede operandos

operandos

definida:

definida:

•• &&&&

•• ||||

•• ?? ::

•• ,, (v(víírgula)

rgula)

©© 2009,

2009, Ulysses

Ulysses de

de Oliveira

Oliveira –– Programa

Programaççãoão Defensiva

Defensiva emem CC

1616

Suposi

Suposiçções

ões sobre

sobre Ordem

Ordem dede

Avaliaççãoão dede Operandos

Avalia

Operandos

Exemplo: Exemplo:

•• Talvez,

Talvez, aa inten

intenççãoão dodo programador

programador não

não seja

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,

2009, Ulysses

Ulysses de

de Oliveira

Oliveira –– Programa

Programaççãoão Defensiva

Defensiva emem CC

1717

Estruturas dede Controle

Estruturas

Controle

©© 2009,

2009, Ulysses

Ulysses de

de Oliveira

Oliveira –– Programa

Programaççãoão Defensiva

Defensiva emem CC

1818

Uso Indevido

Uso

Indevido dede Ponto

Ponto--ee--vvíírgula

rgula

Exemplos: Exemplos:

Problemas

while(i > 0); --i;

Precauções

while(i > 0){; --i; }

if (x > max); max = x;

©© 2009,

2009, Ulysses

Ulysses de

de Oliveira

Oliveira –– Programa

Programaççãoão Defensiva

Defensiva emem CC

if (x > max){; max = x; }

1919

Instruççãoão switch

Instru

switch--case

sem break

break

case sem

switch switch--case

case possui

possui efeito

efeito cascata

cascata

•• Muito

Muito raramente,

raramente, este

este efeito

efeito éé desejado

desejado

•• Instru

Instruçções

ões break

break anulam

anulam oo efeito

efeito cascata

cascata

•• Quando

Quando oo efeito

efeito cascata

cascata éé desejado,

desejado, inclui

inclui--sese

umum coment

comentáário

rio

©© 2009,

2009, Ulysses

Ulysses de

de Oliveira

Oliveira –– Programa

Programaççãoão Defensiva

Defensiva emem CC

2020

Instruççãoão switch

Instru

switch--case

sem break

break

case sem

Exemplos: Exemplos:

switch (opcao) {

case 1:

 

x

= y – z;

case 2:

 

...

default:

 

...

}

switch (opcao) { case 1:

 

x

Falta de break acidental ou proposital?

= y – z; /* Segue-se efeito cascata */ case 2:

...

default:

}

...

©© 2009,

2009, Ulysses

Ulysses de

de Oliveira

Oliveira –– Programa

Programaççãoão Defensiva

Defensiva emem CC

2121

Instruççãoão dodo--while

Instru

while Confundida

Confundida

com REPEAT

com

REPEAT--UNTIL

UNTIL

EmEm algumas

algumas linguagens,

linguagens, aa estrutura

estrutura

equivalente aa dodo--while

equivalente

while repete

repete aa

execuççãoão dodo seu

execu

seu corpo

corpo at

atéé que

que uma

uma

condi

condiççãoão seja

seja satisfeita

satisfeita

Programadores Programadores acostumados

acostumados com

com essas

essas

linguagens tendem

linguagens

tendem aa pensar

que dodo--

pensar que

while funciona

while

funciona dada mesma

mesma maneira

maneira

©© 2009,

2009, Ulysses

Ulysses de

de Oliveira

Oliveira –– Programa

Programaççãoão Defensiva

Defensiva emem CC

2222

Instruççãoão dodo--while

Instru

while Confundida

Confundida

com REPEAT

com

REPEAT--UNTIL

UNTIL

Exemplo Exemplo emem Pascal:

Pascal:

REPEAT ... UNTIL (x < 0) AND (y > 10);

Transcri Transcriççãoão errada

errada emem C:

C:

do { ... } while ((x < 0) && (y > 10));

Os Os dois

dois lalaçços

os não

não podem

podem ser

ser equivalentes!

equivalentes!

©© 2009,

2009, Ulysses

Ulysses de

de Oliveira

Oliveira –– Programa

Programaççãoão Defensiva

Defensiva emem CC

2323

else

else que

que Não

Não Corresponde

Corresponde aoao ifif

Desejado

Desejado

UmUm else

else sempre

sempre corresponde

corresponde aoao ifif mais

mais

próóximo

pr

ximo que

que ainda

ainda não

não possui

possui else

else

correspondente (mas

correspondente

(mas hháá uma

uma exce

exceçção

ão

...

...

)

)

•• Exemplo:

Exemplo:

if (x == 0)

++y;

--x;

  • if (y == 0)

Casamento
Casamento
  • else

•• Corre

Correçção:

ão:

if (y == 0)

++y;

--x;

  • if (x == 0) {

Casamento
Casamento
  • } else

©© 2009,

2009, Ulysses

Ulysses de

de Oliveira

Oliveira –– Programa

Programaççãoão Defensiva

Defensiva emem CC

2424

Defini

Definiçções

ões Incorretas

Incorretas dede

Fun

Funçções

ões

©© 2009,

2009, Ulysses

Ulysses de

de Oliveira

Oliveira –– Programa

Programaççãoão Defensiva

Defensiva emem CC

2525

Recursão

Recursão sem

sem FimFim

UmUm caso

caso não

não--recursivo

recursivo dede uma

uma fun

funççãoão

recursiva deve

recursiva

deve ser

sempre atingido

atingido

ser sempre

•• Exemplo

Exemplo::

     

int Fatorial(int n)

 

E se a função for

 

{

chamada com um

if(!n || n == 1)

valor negativo?

return 1;

 

return n*Fatorial(n-1);

}

©© 2009,

2009, Ulysses

Ulysses de

de Oliveira

Oliveira –– Programa

Programaççãoão Defensiva

Defensiva emem CC

2626

Recursão

Recursão sem

sem FimFim

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,

2009, Ulysses

Ulysses de

de Oliveira

Oliveira –– Programa

Programaççãoão Defensiva

Defensiva emem CC

2727

Retorno dede Zumbis

Retorno

Zumbis

Uma Uma fun

funççãoão não

não deve

deve retornar

retornar oo endere

endereççoo

dede uma

uma vari

variáável

vel dede dura

duraççãoão autom

automáática

tica

•• Exemplo:

Exemplo:

char* UmaFuncao1(const char *str)

{

 

char aux[80];

...

return aux; /* Zumbi */

}

©© 2009,

2009, Ulysses

Ulysses de

de Oliveira

Oliveira –– Programa

Programaççãoão Defensiva

Defensiva emem CC

2828

Retorno dede Zumbis

Retorno

Zumbis

HHáá duas

duas sosoluluçções:

ões:

  • 1. 1. Usar

Usar uma

uma vari

variáável

vel dede dura

duraççãoão fixa

fixa::

char* UmaFuncao2(const char *str)

{

 

static char aux[80];

...

return aux; /* OK. Não é Zumbi */

}

©© 2009,

2009, Ulysses

Ulysses de

de Oliveira

Oliveira –– Programa

Programaççãoão Defensiva

Defensiva emem CC

2929

Retorno dede Zumbis

Retorno

Zumbis

HHáá duas

duas sosoluluçções:

ões:

  • 2. 2. Usar

Usar aloca

alocaççãoão dinâmica

dinâmica dede mem

memóória

ria::

char* UmaFuncao3(const char *str)

{

 

char *aux = malloc(80*sizeof(char));

...

return aux; /* OK. Não é Zumbi */

}

©© 2009,

2009, Ulysses

Ulysses de

de Oliveira

Oliveira –– Programa

Programaççãoão Defensiva

Defensiva emem CC

3030

Fun

Funçções

ões sem

sem oo Devido

Devido Retorno

Retorno

Exemplo: Exemplo:

#include <stdio.h>

int F(int arg) {

if (arg > 0) return arg;

}

int main(void) {

O que ocorre, quando esta função é chamada com um parâmetro negativo?

printf( "\nValor retornado por F(10): %d\n",

F(10));

printf( "Valor retornado por F(-10): %d\n",

F(-10));

return 0;

}

©© 2009,

2009, Ulysses

Ulysses de

de Oliveira

Oliveira –– Programa

Programaççãoão Defensiva

Defensiva emem CC

3131

Vazamento dede Mem

Vazamento

Memóória

ria

SeSe uma

uma fun

funççãoão retorna

retorna sem

sem liberar

liberar umum

bloco alocado

bloco

alocado dinamicamente,

dinamicamente, ele

ele ser

seráá

perdido:

perdido:

void F(const char *str)

{

 

char *p = malloc(strlen(str) + 1);

/* Algum processamento */

/* com o bloco alocado */

}

©© 2009,

2009, Ulysses

Ulysses de

de Oliveira

Oliveira –– Programa

Programaççãoão Defensiva

Defensiva emem CC

3232

Chamadas

Chamadas Incorretas

Incorretas dede

Fun

Funçções

ões

©© 2009,

2009, Ulysses

Ulysses de

de Oliveira

Oliveira –– Programa

Programaççãoão Defensiva

Defensiva emem CC

3333

Suposi

Suposiçções

ões sobre

sobre Ordem

Ordem dede

Avaliaççãoão dede Parâmetros

Avalia

Parâmetros

OO resultado

resultado dede uma

uma chamada

chamada dede fun

funççãoão

não deve

não

deve depender

depender dada ordem

ordem nana qual

qual os

os

parâmetros

parâmetros são

são avaliados

avaliados

©© 2009,

2009, Ulysses

Ulysses de

de Oliveira

Oliveira –– Programa

Programaççãoão Defensiva

Defensiva emem CC

3434

Suposi

Suposiçções

ões sobre

sobre Ordem

Ordem dede Avalia

Avaliaççãoão

dede Parâmetros

Parâmetros

Exemplo

Exemplo –– Efeito

Efeito dada ordem

ordem dede empilhamento

empilhamento dede parâmetros

parâmetros

#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,

2009, Ulysses

Ulysses de

de Oliveira

Oliveira –– Programa

Programaççãoão Defensiva

Defensiva emem CC

3535

Omissão dede Teste

Omissão

Teste dede Condi

Condiççãoão dede

Exce Exceççãoão

Toda Toda fun

funççãoão que

que retorna

retorna valor

valor indicando

indicando

ocorrência dede erro

ocorrência

erro deve

deve ter

ter seu

seu valor

valor dede

retorno testado

retorno

testado

Fun Funçções

ões not

notááveis

veis nesta

nesta categoria:

categoria:

•• malloc()

malloc(),, calloc()

calloc() ee realloc()

realloc()

•• fopen()

fopen()

©© 2009,

2009, Ulysses

Ulysses de

de Oliveira

Oliveira –– Programa

Programaççãoão Defensiva

Defensiva emem CC

3636

Omissão dede Teste

Omissão

Teste dede Condi

Condiççãoão dede

Exce Exceççãoão

Exemplo Exemplo –– emem vez

vez dede usar:

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,

2009, Ulysses

Ulysses de

de Oliveira

Oliveira –– Programa

Programaççãoão Defensiva

Defensiva emem CC

3737

Omissão dede Teste

Omissão

Teste dede Condi

Condiççãoão dede

Exce Exceççãoão

Algumas Algumas fun

funçções

ões sinalizam

sinalizam aa ocorrência

ocorrência

dede erro

por meio

meio dada vari

variáável

erro por

vel errno

errno

Deve Deve--sese checar

checar sese oo valor

valor desta

desta vari

variáável

vel

foi alterado

foi

alterado apapóóss aa chamada

chamada dede uma

uma

dessas

dessas fun

funçções

ões

©© 2009,

2009, Ulysses

Ulysses de

de Oliveira

Oliveira –– Programa

Programaççãoão Defensiva

Defensiva emem CC

3838

Omissão dede Teste

Omissão

Teste dede Condi

Condiççãoão dede

Exce Exceççãoão

Exemplo Exemplo –– emem vez

vez dede escrever:

escrever:

double y;

 

...

E se

x for

y = sqrt(x);

y = sqrt(x);

negativo?

printf("Valor de y = %f", y);

 

Suponha que x represente uma expressão

complexa

Deve

Deve--sese escrever:

escrever:

double y; ... errno = 0;

y = sqrt(x);

if (!errno) /* Não ocorreu erro */ printf("Valor de y = %f", y);

©© 2009,

2009, Ulysses

Ulysses de

de Oliveira

Oliveira –– Programa

Programaççãoão Defensiva

Defensiva emem CC

3939

Omissão dede Teste

Omissão

Teste emem Aloca

Alocaççãoão

Dinâmica dede Mem

Dinâmica

Memóória

ria

OO uso

uso dede uma

macro pode

pode facilitar

uma macro

facilitar aa

tarefa

tarefa sese oo programa

programa deve

deve reagir

reagir sempre

sempre

dede uma

uma certa

certa maneira

maneira quando

quando não

não éé

possíível

poss

vel alocar

alocar espa

espaççoo

Macro ASSEGURA_MALLOC
Macro ASSEGURA_MALLOC

©© 2009,

2009, Ulysses

Ulysses de

de Oliveira

Oliveira –– Programa

Programaççãoão Defensiva

Defensiva emem CC

4040

Implementa

Implementaçções

ões Incorretas

Incorretas dada

Biblioteca Padrão

Biblioteca

Padrão

Algumas Algumas implementa

implementaçções

ões dede fun

funçções

ões dada

biblioteca padrão

biblioteca

padrão não

não seguem

seguem as

as

especifica

especificaçções

ões dodo padrão

padrão ISO

ISO dede CC

Exemplos Exemplos emem versões

versões recentes

recentes dede glib

glib::

snprintf() ee vsnprintf()

snprintf()

vsnprintf()

Sugestão Sugestão:: consulte

consulte FAQs

FAQs,, newsgroups,

newsgroups,

etc.

etc.

©© 2009,

2009, Ulysses

Ulysses de

de Oliveira

Oliveira –– Programa

Programaççãoão Defensiva

Defensiva emem CC

4141

Chamadas

Chamadas dede Fun

Funçções

ões sem

sem

Parâmetros Parâmetros

EmEm algumas

algumas linguagens,

linguagens, uma

uma fun

funççãoão sem

sem

parâmetros éé chamada

parâmetros

chamada usando

usando--sese apenas

apenas

seu nome

seu

nome

EmEm C,

C, éé legal

legal usar

usar isoladamente

isoladamente oo nome

nome dede

uma fun

uma

funççãoão definida

definida com

com ouou sem

sem

parâmetros:

parâmetros:

void UmaFuncaoSemParametros() { ... Legal, mas inútil } ... UmaFuncaoSemParametros; ©© 2009, 2009, Ulysses Ulysses de
void UmaFuncaoSemParametros()
{
...
Legal, mas inútil
}
...
UmaFuncaoSemParametros;
©© 2009,
2009, Ulysses
Ulysses de
de Oliveira
Oliveira –– Programa
Programaççãoão Defensiva
Defensiva emem CC
4242

Entrada ee SaSaíídada

Entrada

©© 2009,

2009, Ulysses

Ulysses de

de Oliveira

Oliveira –– Programa

Programaççãoão Defensiva

Defensiva emem CC

4343

Uso Incorreto

Uso

Incorreto dede scanf()

scanf()

Erro

Erro comuns:

comuns: