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

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

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

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

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

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

2.9 ГБ памяти используется и продолжает расти

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

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

1 ответ

Решение

мысли

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

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

Испытания

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

cc^^ вылетает с ошибкой обычной неверной команды.

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

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

cc ^^ вылетает с ошибкой обычной неверной команды.

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

cc"^ вылетает с ошибкой обычной неверной команды.

cc"^^ вылетает с ошибкой обычной неверной команды.

cc"^^^ вылетает с ошибкой обычной неверной команды.

Заметки

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

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

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