Nella programmazione, un gotcha è una caratteristica di un programma o un linguaggio di programmazione, che lavora in un modo che è corretto dal punto di vista formale – cioè rispetta la sintassi del linguaggio – ma che non è quello che ci si aspetta dal programma, nelle intenzioni del programmatore. Ciò induce all'errore perché tale comportamento è sia facile da riprodurre che completamente inaspettato.
Il termine è una storpiatura della pronuncia dell'espressione inglese I got you, che in questo contesto si potrebbe tradurre con "Ti ho beccato". In questo senso, una resa in italiano accettabile potrebbe essere "trabocchetto".
Ad esempio in un programma C, quando scriviamo l'istruzione:
if(a = b)
printf("Hello World\n");
il programma stamperà a video la stringa "Hello World" solo se b è diverso da false, in quanto il programma assegna ad a il valore di b e poi valuta a. Infatti in C, come in molti altri linguaggi, l'operatore di assegnamento (=) è distinto da quello di confronto (==).
Probabilmente il programmatore intendeva scrivere:
if(a == b)
printf("Hello World\n");
che invece valuta se il valore a è uguale a quello del valore b, e in caso positivo stampa la stringa "Hello World".
Questo è appunto il caso di un "gotcha".
Un altro esempio
/* File name: fortytwo.c */
#include <stdio.h>
foo() {
printf(" 42!\n");
}
int main() {
printf("Qui sotto scriverò '42':\n");
foo;
printf("Penso di aver scritto '42', ma non ne sono sicuro...\n");
return 0;
}
Il programma, dopo essere stato compilato ed eseguito, produrrà in output:
$ ./fortytwo
Qui sotto scriverò '42':
Penso di aver scritto '42', ma non ne sono sicuro...
Ciò che l'espressione foo; fa – in modo controintuitivo per chi non conosce a fondo il linguaggio – è quello di restituire l'indirizzo di memoria della funzione foo. Probabilmente il programmatore intendeva effettuare una chiamata a funzione:
foo();
dove le parentesi indicano una chiamata a funzione senza argomenti.