本帖最后由 CrLf 于 2012-3-19 14:43 编辑
回复 10# qzwqzw
确实比较曲折,因为以往没有意识到两点:
1、for /f 对参数的解析并不是简单判断首尾符号再 jmp 的,它会对参数进行分析再决定如何调用相应模块,这二者有点类似 %str% 与 !str! 的关系
2、字符串模块和命令输入模块调用完毕后会终止 for /f,所以他们可能是通过 jmp 调用的,而从文件读取输入时会将参数挨个解析,可能是用 call 的
另外,一直听人说 usebackq 问题很多,不知 usebackq 和 for /r 的 bug 是什么?可否举两个实例呢?
还有说道内存泄露,想起前两天看到旧帖中 zqz 回复的测试代码,稍微修改下:- @echo off
- setlocal enabledelayedexpansion
- for /l %%a in (0 1 8192) do (
- set,=a!,!||(echo !,!&echo 长度为 %%a 个字符&pause)
- )
- pause
复制代码 链接:http://bbs.bathome.net/redirect. ... 8&fromuid=30406
这里让我搞不明白,变量名 , 明明存在于变量表中,为何会多出一个字节的容量,后来发现变量表里,!,! 变量末尾的 nul 消失了,并且跟着一串陌生的内容,以这段陌生内容为关键词搜索内存段,发现是紧跟在 ss:100 之前的内容(debug里看到的几个段寄存器是一样的,所以分不清是数据段还是堆栈段)。
可能因为 echo 命令错误退出的原因,有部分 !,! 的内容没有被填充为 nul,所以还能观察到 echo 的内容后丢失了 0A。
估计设置变量时,内存内容原本应该是 00(填充堆栈剩余内存) 变量内容(反序)=变量名(反序),以 , 为名设置变量时因为错误解析的原因把 00 挤没了(设置变量时是用的堆栈保存数据的吗?感觉有点像),cmd 将数据段字符串照搬到变量表时,却只以 00 为字符串结束的标志,所以 debug 可以看到溢出的内容,而用 set 或 echo 却只能看到变量 0~8192 字符长度的内容 |