Leggere da un canale chiuso ('val := <-ch') non blocca la goroutine ma restituisce immediatamente il valore zero del tipo; se eseguito in un ciclo senza verificare il secondo valore booleano 'val, ok := <-ch', genera un loop infinito a consumo 100% CPU.
CLOSED_CHANNEL_ZERO_VALUE_LOOP
→
Un 'sync.Mutex' non deve mai essere copiato per valore: passare una struct contenente un mutex a una funzione o ricevitore senza puntatore ('(s MyStruct) Func()') crea una copia disallineata del lock distruggendo la mutua esclusione.
MUTEX_COPIED_BY_VALUE
→
Passare una variabile 'sync.WaitGroup' a una goroutine per valore anziché per puntatore ('*sync.WaitGroup') fa sì che il metodo 'Done()' decrementi una copia locale, lasciando il 'Wait()' principale bloccato per sempre in deadlock.
WAITGROUP_COPIED_BY_VALUE
→
L'operazione 'slice = append(slice, item)' non è atomica: se eseguita da più goroutine contemporaneamente senza sincronizzazione con mutex, sovrascrive elementi o corrompe il puntatore alla backing array.
SLICE_APPEND_DATA_RACE
→
Tentare di scrivere su un canale non bufferizzato ('ch <- val') prima di avviare una goroutine ricevente indipendente blocca la goroutine corrente all'infinito, provocando l'intervento del rilevatore di deadlock.
SAME_GOROUTINE_CHANNEL_DEADLOCK
→