l'allocazione di memoria ed il suo uso corretto sono responsabilità del programmatore nel linguaggio C.
codice:
    char *str = (char *)malloc(10);
    str[15]='\0';
è formalmente corretto ed il compilatore lo compila correttamente.
Probabilmente 90 volte su cento non avrai neppure un errore a run-time.
Questo tipo di errori sono molto subdoli, non sai quando si possano presentare e sono quindi difficilissimi da individuare. Ti raccomando di inserire dei controlli stretti sugli input.

ciao
sergio