Простой карет (^) в конце пакетного файла Windows потребляет всю память

Этот простой командный файл в относительно коротком порядке расходует всю доступную память на Windows 7 (x64). Что происходит? и какие меры предосторожности могут быть приняты для защиты от этого?

any-invalid-command-you-like-here ^

По-видимому, необходимые предпосылки для проявления эффекта:

  • каретка ^ является последней вещью в файле, а script не заканчивается символом новой строки
  • карету предшествует по меньшей мере 2 пробела или символов, например. если точки в следующем представляют собой пробелы, утечка памяти не будет срабатывать .^, тогда как это будет ..^ (только медленно)

В этом скриншоте Process Explorer script работало около 30 секунд, потреблялось 2,9 ГБ и продолжало расти с постоянной скоростью:

2.9GB memory consumed and still climbing

Если вы собираетесь поэкспериментировать с этим, убедитесь, что вы можете попасть в элемент управления Close Window [X] или запустить диспетчер задач или Process Explorer в качестве Ctrl-C, Ctrl-Break, Alt-F4 не имеют эффекта.

Похоже, что несколько карманов заставят использовать память быстрее. В первый раз, когда я столкнулся с этим, в течение 1-2 минут недостаточно памяти для выполнения простых вещей, таких как Alt-Tab, и даже 3-й салют пальца Ctrl-Alt-Del был неэффективным. Мне пришлось сильно отключить машину.

Ответ 1

Мысли

Причина этого (из моего понимания) объясняется интерпретатором cmd, который ищет символа, которого нужно избежать, поскольку ^ является символом escape партии. Вместо того, чтобы правильно идентифицировать конец файла eof в этом сценарии, cmd просто продолжает цикл и инициализирует что-то во время поиска символа.

Воспроизводится на Windows 8 Pro (64) с помощью cc^^^ (Несколько карат, используемых для ускорения утечки).

Испытания

cc^ бесконечный цикл и течет очень медленно.

cc^^ сбой при нормальной ошибке.

cc^^^ бесконечный цикл и течет быстрее.

cc ^ бесконечный цикл и утечки очень медленно.

cc ^^ сбой при нормальной ошибке.

cc ^^^ бесконечный цикл и утечка быстрее.

cc"^ сбой при нормальной ошибке.

cc"^^ сбой при нормальной ошибке.

cc"^^^ сбой при нормальной ошибке.

Примечания

  • Только бесконечные петли и утечки, когда караты ^ используются буквально (вне цитат). Когда в цитате добавлено сообщение об ошибке script со стандартной недопустимой командной ошибкой.
  • Только бесконечный цикл и утечки, когда командный файл кодируется как UTF-8 или ASCII. Когда UTF-16, script выходит из строя со стандартной недопустимой командой.
  • Должно быть нечетное количество каратов, чтобы не покинуть последний карат.

Меры предосторожности

  • Убедитесь, что пакетные скрипты не заканчиваются карат ^ (0x5E) или, по крайней мере, нечетное количество каратов.
  • Или закодировать их в UTF-16.