На этапе семантического анализа строится таблица символов, производится проверка типов и т.д.
То есть, програма может быть синтаксически верна, но содержать семантические ошибки:
int a = 0;
int *ptr = &b; // b - неопределено
ptr = a; // нет неявного приведения числа к указателю