Когда атом используется впервые, ему присваивается внутренний номер и он помещается в массив в виртуальной машине. Этот массив размещается статически и может заполняться, если используется достаточно много разных атомов. binary_to_existing_atom будет преобразовывать только двоичную строку в атом, который уже существует в массиве, если он не существует, вызов завершится неудачно.
Если вы преобразуете входные данные непосредственно в атомы без каких-либо проверок работоспособности, внешний клиент мог бы отправлять << "a" >> и << "b" >> до тех пор, пока в какой момент массив не заполнится. ВМ рухнет.
Еще один способ избежать этого - просто не использовать binary_to_atom, а вместо этого сопоставлять паттерны в разных двоичных файлах и возвращать нужный атом.