• windbg学习--- C++表达式


    C++ 表达式解析器支持所有 C++ 表达式语法形式。包括所有数据类型(包括指针,浮点数,数组)以及 C++ 所有一元和二元运算符。

    ?? 默认是对C++表达式求值

    C++ 表达式中的数值

    除非另有说明,C++ 表达式中的数值被当作十进制来解析。添加 0x 前缀指定十六进制整数。添加 0(零)指定八进制整

    这点比较坑,一定要特别注意,因为大家习惯是用16进制的

    0:000> ? 1
    Evaluate expression: 1 = 00000001
    0:000> ?? 1
    int 1
    0:000> ?? 1f
    float 1
    0:000> ? 1f
    Evaluate expression: 31 = 0000001f
    0:000> ?? 0x1f
    int 31
    可以看到c++表达式输出的结果都是10进程

    调试器使用的缺省基数不影响 C++ 表达式的输入,也就是n 16对C++的输出没有任何影响

    C++ 表达式中的字符和字符串

    输入字符时用单引号(')括住。可以使用标准的 C++ 转义字符。

    输入字符串时用双引号(")括住。可以在字符串中使用转义字符序列 " 。然而,字符串对于表达式求值器无意义

    0:000> ?? 'c'
    char 99 'c'
    0:000> ?? "c:"
    EOF in literal '"c:"'

    C++ 表达式中的运算符

    可以用圆括号来掩盖优先级规则

    数据类型按C++语言的常规方法来指定。可以识别表示数组([ ]),指针成员(->),UDT(译注:用户定义类型,User defined types)成员(.),以及所有的类成员(::)。支持所有算术运算符,包括赋值运算符和带副作用的运算符。但是,不允许使用newdeletethrow 运算符,当然,也不能调用函数。

    支持指针运算,也可以正确计算偏移。注意不能给函数指针加上某个偏移值 (如果需要这样做,首先把它强制转换为指向字符的指针)。

    Class :: Member

    Class
    ::~Member

    :: Name
    类成员

    类成员(析构函数)

    全局的

    0:002> ?? VerifySIgnDemo!CVerifySIgnDemoDlg::OnBtnTest
    <function> 0x00402c00
     void  VerifySIgnDemo!CVerifySIgnDemoDlg::OnBtnTest+0( void )
    0:002> ?? g_NewWinVerifyTrust
    <function> * 0x00000000
    我们可以对比下用MASM规则来:

    0:002> ? VerifySIgnDemo!CVerifySIgnDemoDlg::OnBtnTest
    Evaluate expression: 4205568 = 00402c00
    0:002> ? g_NewWinVerifyTrust
    Evaluate expression: 4290536 = 004177e8
    可以看到,都变成求值了

    Structure . Field

    Pointer
    -> Field

    Name
    [integer]

    LValue ++

    LValue --

    dynamic_cast <
    type>(Value)

    static_cast <
    type>(Value)

    reinterpret_cast <
    type>(Value)

    const_cast <
    type>(Value)
    结构成员

    被引用结构的成员

    数组下标

    加一(计算后)

    减一(计算后)

    类型强制转换(总会执行)

    类型强制转换(总会执行)

    类型强制转换(总会执行)

    类型强制转换(总会执行)

    0:000> ?? WinTrustData
    struct _WINTRUST_DATA
       +0x000 cbStruct         : 0x2c
       +0x004 pPolicyCallbackData : (null) 
       +0x008 pSIPClientData   : (null) 
       +0x00c dwUIChoice       : 2
       +0x010 fdwRevocationChecks : 0
       +0x014 dwUnionChoice    : 1
       +0x018 pFile            : 0x0012f464 WINTRUST_FILE_INFO_
       +0x018 pCatalog         : 0x0012f464 WINTRUST_CATALOG_INFO_
       +0x018 pBlob            : 0x0012f464 WINTRUST_BLOB_INFO_
       +0x018 pSgnr            : 0x0012f464 WINTRUST_SGNR_INFO_
       +0x018 pCert            : 0x0012f464 WINTRUST_CERT_INFO_
       +0x01c dwStateAction    : 0
       +0x020 hWVTStateData    : (null) 
       +0x024 pwszURLReference : (null) 
       +0x028 dwProvFlags      : 0
    0:000> ?? WinTrustData.pFile
    struct WINTRUST_FILE_INFO_ * 0x0012f464
       +0x000 cbStruct         : 0x10
       +0x004 pcwszFilePath    : 0x00278680  -> 0x65
       +0x008 hFile            : (null) 
       +0x00c pgKnownSubject   : (null) 

    0:000> ?? static_cast<int>(&WinTrustData)
    int 1242152
    0:000> ? WinTrustData
    Evaluate expression: 1242152 = 0012f428
    Value * Value

    Value
    / Value

    Value
    % Value
    乘法

    除法

    求余
    0:000> ?? 4*2
    int 8
    0:000> ?? 4 / 2
    int 2
    0:000> ?? 4/2
    int 2
    0:000> ?? 4%2
    int 0
    

    Value + Value

    Value
    - Value
    加法

    减法
    0:000> ?? 3+1
    int 4
    0:000> ?? 3-1
    int 2

    Value << Value

    Value
    >> Value
    左移位

    右移位
    0:000> ?? 2>>1
    int 1
    0:000> ?? 2<<1
    int 4

    (type) Value

    sizeof value

    sizeof( type )

    ++
    LValue

    -- LValue

    ~ Value

    ! Value

    - Value

    + Value

    & LValue

    * Value
    类型强制转换(总会执行)

    表达式大小

    数据类型大小

    加一(计算前)

    减一(计算前)

    按位反

    逻辑非

    一元运算符,负数

    一元运算符,正数

    数据类型的地址

    解引用,取值
    0:000> ?? sizeof 1
    unsigned int 4
    0:000> ?? sizeof(WinTrustData)
    unsigned int 0x2c
    

    Value < Value

    Value
    <= Value

    Value
    > Value

    Value
    >= Value
    小于(比较)

    小于等于(比较)

    大于(比较)

    大于等于(比较)
    0:000> ?? 1<2
    bool true
    0:000> ?? 1<=2
    bool true
    0:000> ?? 1>2
    bool false
    0:000> ?? 1>=2
    bool false
    

    Value == Value

    Value
    != Value
    等于(比较)

    不等于(比较)
    0:000> ?? 1==2
    bool false
    0:000> ?? 1!=2
    bool true
    

    Value & Value 按位与
    Value ^ Value 按位异或(不同于 OR)
    Value | Value 按位或
    Value && Value 逻辑与
    Value || Value 逻辑或
    0:000> ?? 1&2
    int 0
    0:000> ?? 1^2
    int 3
    0:000> ?? 1|2
    int 3
    0:000> ?? 1&&2
    bool true
    0:000> ?? 1||2
    bool true
    0:000> ?? 0&&2
    bool false
    

    LValue = Value

    LValue
    *= Value

    LValue
    /= Value

    LValue
    %= Value

    LValue
    += Value

    LValue
    -= Value

    LValue
    <<= Value

    LValue
    >>= Value

    LValue
    &= Value

    LValue
    |= Value

    LValue
    ^= Value
    赋值

    乘之后赋值

    除之后赋值

    求余之后赋值

    加之后赋值

    减之后赋值

    左移位之后赋值

    右移位之后赋值

    与之后赋值

    或之后赋值

    异或之后赋值
    Value ? Value : Value 三元条件运算符
    Value , Value 逗号运算符。计算所有值,保留最右边的值


    使用@@c++(...)可以显式指定括号中表达式所使用的语法规则,





  • 相关阅读:
    this:从JavaScript执行上下文视角讲this
    作用域链和闭包:代码中出现相同的变量,JavaScript引擎如何选择
    调用栈:为什么JavaScript代码会出现栈溢出
    变量提升:JavaScript代码是按顺序执行的吗
    uniapp
    uniapp
    uniapp
    uniapp
    js
    uniapp
  • 原文地址:https://www.cnblogs.com/hgy413/p/3693402.html
Copyright © 2020-2023  润新知