Cmd 为什么这个命令会崩溃?

Cmd 为什么这个命令会崩溃?,cmd,Cmd,我遇到了一个让人震惊的问题,使控制台崩溃了: set "h=/?" & call [if | for | rem] %%h%% IF,FOR和REM。 他们使用自己的特殊解析器,这可能导致一些截取错误,所以它崩溃了 @jeb指出了调用,但将其转换为“令牌”(取决于版本): &返回/ &返回1 |返回2 |返回0 /?返回启动第二轮解析器所需的调用 但有一个小错误(或更多),在该阶段,不可能执行任何特殊命令或使用&、|、&&、|、重定向或命令块 原因似乎是解析器

我遇到了一个让人震惊的问题,使控制台崩溃了

set "h=/?" & call [if | for | rem] %%h%%
  • IF
    FOR
    REM
    。 他们使用自己的特殊解析器,这可能导致一些截取错误,所以它崩溃了
@jeb指出了
调用
,但将其转换为“令牌”(取决于版本):

  • &
    返回
    /
  • &
    返回
    1
  • |
    返回
    2
  • |
    返回
    0

  • /?
    返回启动第二轮解析器所需的
    调用

    但有一个小错误(或更多),在该阶段,不可能执行任何特殊命令或使用
    &
    |
    &&
    |
    、重定向或命令块

    原因似乎是解析器在内部构建了一个令牌图,将特殊事物替换为某种令牌值。
    但是使用
    CALL
    时,执行者不再知道如何处理它们

    此代码尝试执行名为
    3.bat的批处理文件
    (名称可以不同,具体取决于windows版本)

    但在您的示例中,帮助功能是在不可执行令牌上触发的。
    这似乎是刽子手完全失去理智的最终死亡诱因。

    研究总结: 调用linefeeds
    \n
    FOR
    IF
    REM
    的帮助函数会导致cmd崩溃,退出时出现
    ERRORLEVEL
    -1073741819 aka 0xC0000005,表示访问冲突错误

    首先,cmd解析器尝试启动
    werfault
    以终止进程。

    如果您提前终止werfault,将出现一条错误消息!

    访问冲突错误:
    0x00007FF7F18E937B处的指令引用0x0000000000000070处的内存。内存无法读取

    据推测,
    if
    for
    rem
    使用特殊的解析器,但是当调用
    触发帮助功能时,返回一个非命令令牌,这会使cmd解析器崩溃


    资料来源:


  • 为什么不问问脚本的作者@npocmaka?(虽然我猜,它被列在“bugs”下是有原因的)被否决的不是我。我为什么要这样做?我刚才提到作者是为了让你有最大的机会得到答案。三周前呢?我不记得了(可能不记得)。如果你告诉我哪个Q/A,我会告诉你。
        C:\>set "h=/?" & for %h%
        %%h%% was unexpected at this time.
    
        C:\>set "h=/?"
        C:\>call for %%h%%
        --FOR help message--
    
        C:\>set "h=/?" & call for @%%h%%
        CRASH!!!
    
        C:\>set "h=/?" & call for (%%h%%)
        CRASH!!!
    
    set "cmd=(a) & (b)"
    call %%cmd%%