C++ Visual C+中的编译器错误+;2012? (混乱的跳转地址)

C++ Visual C+中的编译器错误+;2012? (混乱的跳转地址),c++,visual-studio,visual-c++,compiler-construction,C++,Visual Studio,Visual C++,Compiler Construction,完全无需优化即可编译此文件 void Add(T data) { node<T> *pNode = new node<T>; pNode->m_pNext = NULL; pNode->m_data = data; uint32_t cPushes; uint32_t cPops; node<T> *pTail; while (true) { cPushes = m

完全无需优化即可编译此文件

void Add(T data)
{
    node<T> *pNode = new node<T>;
    pNode->m_pNext = NULL;
    pNode->m_data = data;

    uint32_t cPushes;
    uint32_t cPops;
    node<T> *pTail;

    while (true)
    {
        cPushes = m_cPushes;
        cPops = m_cPops;
        pTail = (node<T>*)m_pTail;
        if (cPushes != m_cPushes)
            continue;

        if (!pTail)
            if (CAS2(&m_pTail, NULL, cPushes, (uint32_t)pNode, cPushes +1))
                break;
        else if (CAS(&pTail->m_pNext, NULL, (uint32_t)pNode))
                break;
        else
            CAS2(&m_pTail, (uint32_t)pTail, cPushes, (uint32_t)pTail->m_pNext, cPushes + 1);
    }

    CAS2(&m_pHead, NULL, cPops, (uint32_t)pNode, cPops + 1);
    CAS2(&m_pTail, (uint32_t)pTail, cPushes, (uint32_t)pNode, cPushes + 1);
}
void添加(T数据)
{
node*pNode=新节点;
pNode->m_pNext=NULL;
pNode->m_data=数据;
uint32_t cPushes;
uint32_t cPops;
节点*pTail;
while(true)
{
cPushes=m_cPushes;
cPops=m_cPops;
pTail=(节点*)m_pTail;
if(cPushes!=m_cPushes)
继续;
如果(!pTail)
if(CAS2(&m_pTail,NULL,cPushes,(uint32_t)pNode,cPushes+1))
打破
else if(CAS(&pTail->m\u pNext,NULL,(uint32\u t)pNode))
打破
其他的
CAS2(&m_pTail,(uint32_t)pTail,cPushes,(uint32_t)pTail->m_pNext,cPushes+1);
}
CAS2(&m_-pHead,NULL,cPops,(uint32_-t)pNode,cPops+1);
CAS2(&m_pTail,(uint32_t)pTail,cPushes,(uint32_t)pNode,cPushes+1);
}
反汇编:(粘贴组合,因为它很大,而且它以某种方式破坏了SO的代码标记)

如果你看一下,几乎每一条跳转指令的地址都混淆了

例如,如果此语句失败:“if(!pTail)”,则它不会在“else if”处继续,而是跳回循环的开始处(实际上,它跳转到跳转到循环的开始处)

完整代码:

真是

    if (!pTail) {
        if (CAS2(&m_pTail, NULL, cPushes, (uint32_t)pNode, cPushes +1)) {
            break;
        } else if (CAS(&pTail->m_pNext, NULL, (uint32_t)pNode)) {
            break;
        } else {
            CAS2(&m_pTail, (uint32_t)pTail, cPushes, (uint32_t)pTail->m_pNext, cPushes + 1);
        }
    }

跳跃就是这样做的吗?我打赌。

如果。。。如果。。。else
正在解析歧义。我忘记了C++是如何解决它的,但应该在它们的情况下放置括号,这就是所谓的问题,这就是为什么我相信比空白敏感的语言(比如Python)。少撒谎。@Pubby The
else
总是属于最近未关闭的
if
。经验法则:每次你认为你发现了一个编译器错误,你都没有。+1感谢你的彻底性。破解代码发现这是用大炮杀死一只苍蝇,所以,我不应该在达到6天之后再进行编码;)不,你不应该。至少在没有大量咖啡因的情况下是这样。括号和括号是你的朋友,可以让你远离麻烦!我仍然记得,由于没有使用括号强制执行正确的运算符顺序,我遇到了“编译器错误”。让我真正相信括号/括号中的少不是多,多才是多。@RichardChambers:这就是为什么我有时会怀疑运算符优先级是否真的值得。。。规则越复杂,在阅读程序时,就越不清楚优先顺序是有意的还是原作者的失误…@MatthieuM。我从不理解这种态度。如果该守则起作用,那么必须假定作者是有能力的。
    if (!pTail) {
        if (CAS2(&m_pTail, NULL, cPushes, (uint32_t)pNode, cPushes +1)) {
            break;
        } else if (CAS(&pTail->m_pNext, NULL, (uint32_t)pNode)) {
            break;
        } else {
            CAS2(&m_pTail, (uint32_t)pTail, cPushes, (uint32_t)pTail->m_pNext, cPushes + 1);
        }
    }