为什么指针增量语句被优化掉了

Why is a pointer increment statement optimized away?

本文关键字:优化 掉了 语句 指针 为什么      更新时间:2023-10-16

我已经编写了一个解析GPS字符串的方法,但由于某种原因,当不使用-O0时,关键行被优化掉了。方法代码如下:

bool Gps::ParsePMTK_ACK(PmtkAck_t &dst, uint8_t *buf, int32_t size)
{    
    // Verify message ID
    uint8_t *pCur = buf;
    memset(&dst, 0, sizeof(dst));
    if (strncmp((char*)pCur, "$PMTK001", 8) != 0) {
        return false;
    }
    pCur = pCur + 8; // <--- This line gets optimized away when not on -O0
                     //      thus causing the pointer to NOT be incremented
    if (*pCur != SEPARATOR) {
        return false;
    }
    ++pCur; // <--- Not optimized away
    if (ProcessInt(dst.cmd, &pCur) != 1) {
        return false;
    }
    int16_t tmp;
    if (ProcessInt(tmp, &pCur) != 1) {
        return false;
    }
    dst.flag = static_cast<AckFlag_t>(tmp);
    return true;
} // end ParsePMTK_ACK

删除此行时,函数无法处理格式良好的消息,因为if (*pCur != SEPARATOR)条件下的pCur==buf。因此,函数在格式良好的消息上返回false,因为当到达if语句时,指针指向错误的字符。

为什么优化器完全删除了指示的行?有没有更好的方法来实现,这样即使在启用优化器的情况下,我也能实现所需的行为(即,增加的指针)?

我想编译器会转换您的原始代码:

pCur = pCur + 8; // <--- This line gets optimized away when not on -O0
                 //      thus causing the pointer to NOT be incremented
if (*pCur != SEPARATOR) {
    return false;
}
++pCur; // <--- Not optimized away

变成这样:

if (*(pCur + 8) != SEPARATOR) {
    return false;
}
pCur += 9;

从而在调试时造成混乱。