Sei sulla pagina 1di 7

Universit`

a degli Studi di Roma La Sapienza, Facolt`


a di Ingegneria
Corso di
INGEGNERIA DEL SOFTWARE
(Ing. Informatica, Nuovo Ordinamento)
Prof. Marco Cadoli, Canale M-Z
A.A. 2005-06

ESEMPI DI ERRORI DI PROGRAMMAZIONE TIPICI,


RILEVABILI MEDIANTE TEST UMANO

Versione definitiva

Errori tipici in Java


// File Errori.java
// Scopo: illustrare alcuni errori di programmazione tipici
// Nota: non si tratta di errori sintattici, infatti questo file viene
//
compilato con successo dal compilatore javac 1.5.0_01
class B { }
class D extends B { int x_d; }
public class Errori {
public static void main (String[] args) {
int[] vett = new int[10];
vett[10] = 40; // lindice non e
` compreso nei limiti della dimensione
// corrispondente. ERRORE (DI RIFERIMENTO AI DATI) di "off by one"
B b = new B();
D d = (D)b;
System.out.println(d.x_d);
// ERRORE (DI RIFERIMENTO AI DATI): la variabile ha tipo diverso da quello
// previsto dal programma; il campo x_d non esiste
System.out.println("ciao "+2+3); // ERRORE (DI CALCOLO) se crediamo che
// stampi "ciao 5": i calcoli coinvolgono tipi inconsistenti
1

int i = 5;
char c = x;
i+= c;
System.out.println(i); // ERRORE (DI CALCOLO): i calcoli coinvolgono tipi
// inconsistenti. Stampa 125
System.out.println(1. + 1/4); // inconsistenza nei calcoli misti;
// calcolo che coinvolge tipi compatibili ma di precisione differente
// ERRORE (DI CALCOLO) se crediamo che stampi 1.25
int x = 2147483647, y = 2147483647;
System.out.println(x+y); // ERRORE (DI CALCOLO): condizione di overflow; stampa -2
int den = 0;
System.out.println(10/den); // ERRORE (DI CALCOLO): divisione per zero
double base = 4.0, altezza = 2.0;
System.out.println(1/2 * base * altezza); // ERRORE (DI CALCOLO) se crediamo
// che stampi larea del triangolo: le assunzioni sullordine di
// valutazione e di precedenza degli operatori aritmetici non sono corrette
double peso = 85.0;
peso -= 100; // ERRORE (DI CALCOLO):
// il valore esce dallintervallo ragionevole (> 0)
int I = 5;

System.out.println(I/2*2); // ERRORE (DI CALCOLO) se crediamo che sia pari


// ad I: uso sbagliato della divisione fra interi
if (Math.acos(Math.sqrt(2.)/2) - Math.asin(Math.sqrt(2.)/2) == 0)
System.out.println("affidabile");
// ERRORE (DI CALCOLO) se crediamo che stampi "affidabile":
// i reali hanno precisione finita
int anno = 2001;
if (anno % 4 == 0 && anno % 400 == 0 || anno % 100 != 0)
System.out.println("bisestile"); // ERRORE (DI CONFRONTO): stampa "bisestile":
// le assunzioni sullordine di valutazione e di precedenza
// degli operatori aritmetici non sono corrette
if (x != 0 && y/x > 2); // corretta, ma NON SI POSSONO SCAMBIARE
// gli operandi (pratica potenzialmente pericolosa)
float ff;
// POTENZIALE ERRORE: variabile dichiarata ma non usata
}
public static void scambia (int a, int b) {
// ERRORE (DI INTERFACCIA) se crediamo che i parametri attuali vengano scambiati
int temp = a;
a = b;
b = temp;

}
public static void F(D d) {
// ERRORE (DI INTERFACCIA) se pensiamo che d sia un agomento di SOLO input,
// che non sar`
a cambiato
d.x_d = 10;
}
}

Errori tipici in C
// File Errori.c
// Scopo: illustrare alcuni errori di programmazione tipici
// Nota: non si tratta di errori sintattici, infatti questo file viene
//
compilato con successo dal compilatore gcc 3.3.3
#include <stdio.h>
void G(int x) { printf("%d ", x); }
main() {
int x;
float f = 3.14;
int* p;
printf("%d ", x);

// ci si riferisce ad una variabile non inizializzata


// ERRORE (DI RIFERIMENTO AI DATI)

*p = 10;

// la corrispondente area di memoria non e


` stata allocata
// ERRORE (DI RIFERIMENTO AI DATI: dangling reference)

x = f;

// ERRORE (DI CALCOLO): il valore sinistro ha


// rappresentazione meno precisa del valore destro
// Errori.c:21: WARNING: assignment to int from float
// GENERATO DAL COMPILATORE C++ (g++), NON DAL COMPILATORE C (gcc)
2

if
//
//
//
//

(p > x) printf("ciao"); // ERRORE (DI CONFRONTO fra variabili di diverso tipo)


Errori.c:26: WARNING: comparison between pointer and integer
GENERATO DAL COMPILATORE C (gcc)
Errori.c:26: ERROR: ISO C++ forbids comparison between pointer and integer
GENERATO DAL COMPILATORE C++ (g++), NON DAL COMPILATORE C (gcc)

x = 3;
if (5 < x < 10) printf("hello"); // stampa "hello": ERRORE (DI CONFRONTO) se
// crediamo che lespressione significhi (5 < x && x < 10)
G(9.2); // stampa 9: ERRORE (DI INTERFACCIA) se crediamo che stampi 9.2
// Errori.c:31: WARNING: double used for argument 1 of G(int)
// GENERATO DAL COMPILATORE C++ (g++), NON DAL COMPILATORE C (gcc)
x = 3;
if (x = 1) printf("bye"); // stampa "bye": ERRORE (DI BATTITURA) se crediamo di
// avere scritto "x == 1"
}