函数在lpc824中返回错误的值

时间:2017-03-31 22:57:00

标签: c++ function return lpc lpcxpresso

我正在努力将在Arduino Mega上运行的应用程序移植到LPC824。以下代码对两个平台的工作方式都不同。

/**
 * Calculation of CMAC
 */
void cmac(const uint8_t* data, uint8_t dataLength) {

    uint8_t trailer[1] = {0x80};
    uint8_t bytes[_lenRnd];
    uint8_t temp[_lenRnd];

    memcpy(temp, data, dataLength);

    concatArray(temp, dataLength, trailer, 1);
    dataLength ++;

    addPadding(temp, dataLength);

    memcpy(bytes, _sk2, _lenRnd);

    xorBytes(bytes,temp,_lenRnd);

    aes128_ctx_t ctx;
    aes128_init(_sessionkey, &ctx);

    uint8_t* chain = aes128_enc_sendMode(bytes, _lenRnd, &ctx, _ivect);
    Board_UARTPutSTR("chain\n\r");
    printBytes(chain, 16, true);

    memcpy(_ivect, chain, _lenRnd);

    //memcpy(_ivect, aes128_enc_sendMode(bytes,_lenRnd,&ctx,_ivect), _lenRnd);

    memcpy(_cmac,_ivect, _lenRnd);

    Board_UARTPutSTR("Initialization vector\n\r");
    printBytes(_ivect, 16, true);
}

我希望{0x5d, 0xa8, 0x0f, 0x1f, 0x1c, 0x03, 0x7f, 0x16, 0x7e, 0xe5, 0xfd, 0xf3, 0x45, 0xb7, 0x73, 0xa2}变量的值为chain。但是跟随功能的工作方式不同。函数内部的打印具有正确的值,我想要({5d, 0xa8, 0x0f, 0x1f, 0x1c, 0x03, 0x7f, 0x16, 0x7e, 0xe5, 0xfd, 0xf3, 0x45, 0xb7, 0x73, 0xa2})

但是当函数返回chain具有不同的值时,与我期望的相比,我得到chain {0x00, 0x20, 0x00, 0x10, 0x03, 0x01, 0x00, 0x00, 0xd5, 0x00, 0x00, 0x00, 0xd7, 0x00, 0x00, 0x00}

的以下值

在函数内部,结果是正确的。但是它会向调用它的函数返回一个错误的值。为什么会这样?

uint8_t* aes128_enc_sendMode(unsigned char* data, unsigned short len, aes128_ctx_t* key,
        const unsigned char* iv) {

    unsigned char tmp[16];
    uint8_t chain[16];
    unsigned char c;
    unsigned char i;

    memcpy(chain, iv, 16);

    while (len >= 16) {
        memcpy(tmp, data, 16);

        //xorBytes(tmp,chain,16);
        for (i = 0; i < 16; i++) {
            tmp[i] = tmp[i] ^ chain[i];
        }

        aes128_enc(tmp, key);

        for (i = 0; i < 16; i++) {
            //c = data[i];
            data[i] = tmp[i];
            chain[i] = tmp[i];
        }

        len -= 16;
        data += 16;

    }

    Board_UARTPutSTR("Chain!!!:");
    printBytes(chain, 16, true);

    return chain;
}

1 个答案:

答案 0 :(得分:1)

像这样的问题的良好开端是在再现错误时尽可能多地删除,使用最少的代码示例,答案通常是清楚的。我在这里为你做过。

uint8_t* aes128_enc_sendMode(void) {
    uint8_t chain[16];
    return chain;
}

链变量是函数的局部变量,一旦函数存在就不再定义。访问指向该变量的指针会导致未定义的行为,请不要这样做。

实际上,指向数组的指针仍然存在,并指向任意内存块。此内存块不再保留,可以随时覆盖。

我怀疑它适用于AVR,因为它是一个简单的8位芯片,当你使用它时,那块内存就不受干扰了。 ARM会使用更大的优化,可能在寄存器上运行完整的数组,因此数据不会在转换过程中存活。

tldr;你需要malloc()任何你希望通过函数退出的数组。小心,malloc和嵌入式系统像柴油和聚苯乙烯泡沫塑料一样,它会很快变得混乱。