Простая каретка (^) в конце командного файла Windows занимает всю память
Этот простой командный файл в относительно коротком порядке занимает всю доступную память в Windows 7 (x64). В чем дело? и какие меры предосторожности можно предпринять, чтобы противостоять этому?
any-invalid-command-you-like-here ^
Видимо необходимые предпосылки для проявления эффекта:
- карета
^
это самая последняя вещь в файле, и сценарий не заканчивается новой строкой - перед кареткой стоят как минимум 2 пробела или символа, например, если точки в следующем представляют пробелы, утечка памяти не будет вызвана
.^
в то время как этот будет..^
(просто медленно)
На этом снимке экрана Process Explorer сценарий работал около 30 секунд, потреблял 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.