Почему g ++ генерирует огромный журнал ошибок? - PullRequest
0 голосов
/ 02 января 2019

Где-то я видел, что эта искаженная программа на C ++ может заставить g ++ генерировать огромный журнал ошибок:

int main()
{
    struct x struct z<x(x(x(x(x(x(x(y,x(y><y*,x(y*w>v<y*,w,x{};
    return 0;
}

Повторяя (x много раз, журнал ошибок может вырасти до> 1 ГБ.Таким образом, эта программа может быть использована для отвода системных ресурсов жертвы.Хотя эта проблема может быть исправлена ​​с помощью --fmax-error, мне любопытно, что происходит внутри g ++ во время его компиляции, что заставляет его выплевывать такой журнал.

1 Ответ

0 голосов
/ 02 января 2019

Я не могу действительно ответить , что происходит с конкретным набором вещей , так что ошибок неисчислимо, но помните, что в C ++ возможно самая сложная грамматика , известная человеку ,

Частью работы компилятора является информирование пользователя о том, что неправильно с определенным вводом, что он недопустим (или в случае предупреждений, хорош) C ++.

Вы можете получить экспоненциальный рост количества сообщений об ошибках, когда у вас есть рекурсивная неоднозначность, так как компилятор сообщит вам о наборе вещей, которые может означать . Предположим, что ? может означать A или B, ??? может быть любым из AAA, AAB, ABA, ABB, BAA, BAB, BBA или BBB.

Компилятор знает только, что 100000000-е почти повторение не важно для вас , когда вы говорите это с помощью --fmax-error.

...