In effetti la sicurezza 'in più' rispetto a gets() è quella di impostare il numero massimo di caratteri N da leggere ed inserire nell'array di caratteri,e sempre rispetto a gets() il carattere '\n' viene considerato valido, per cui è inserito nella stringa. Però, nessuno mi vieta di inserire un valore N maggiore delle dimensioni reali della stringa, per cui anche fgets(), se non usata in modo corretto, porta a dei rischi di buffer overflow. Facendo alcune prove, il rischio è evidente se si usa con fgets() un array allocato in heap memory (alla chiusura infatti il programma smette di funzionare).
Un'altra 'instabilità' che ho notato della fgets() è anche il fatto che non si preoccupa di verificare i flags del file, quindi anche se il file ha il 'badbit' settato, la fgets() legge lo stesso l'input.