This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F2800135:在 driverlib src 代码中使用 no-init 指针、可能很危险。

Guru**** 2587365 points
Other Parts Discussed in Thread: C2000WARE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1370861/tms320f2800135-use-a-no-init-pointer-in-driverlib-src-code-maybe-dangerous

器件型号:TMS320F2800135
主题中讨论的其他器件:C2000WARE

工具与软件:

大家好、

此函数来自 C:\ti\c2000\C2000Ware_5_02_00_00\driverlib\f280013x\driverlib\adc.c

它声明了指针偏移。 但我们发现、当所有条件都不满足时、可能会有风险。 它将运行 第88行:  *offset = 0u;,但在此之前没有 initalize offset 指针。 因此我们认为偏移指针是一个随机地址、非常危险、可能会导致程序崩溃。

您对此问题有任何意见吗? CCS 是否对 no-init 指针进行了任何优化?  

//*****************************************************************************
//
// ADC_setOffsetTrim
//
//*****************************************************************************
void
ADC_setOffsetTrim(uint32_t base)
{
    uint16_t *offset;
    uint32_t moduleShiftVal;
    uint16_t offsetShiftVal;
    uint16_t analogRefRegVal;
    ADC_ReferenceMode refMode;
    ADC_ReferenceVoltage refVoltage;

    //
    // Check the arguments.
    //
    ASSERT(ADC_isBaseValid(base));

    //
    // Assign a shift amount corresponding to which ADC module is being
    // configured.
    //
    switch(base)
    {
        case ADCA_BASE:
            moduleShiftVal = 0U;
            break;
        case ADCC_BASE:
            moduleShiftVal = 1U;
            break;
        default:
            //
            // Invalid base address!!
            //
            moduleShiftVal = 0U;
            break;
    }

    //
    // Read the Analog Reference Control Register value to determine the
    // ADC reference mode and reference voltage value.
    //
    analogRefRegVal = HWREGH(ANALOGSUBSYS_BASE + ASYSCTL_O_ANAREFCTL);

    //
    // Calculate refMode and refVoltage based on input ADC base
    //
    refMode = (ADC_ReferenceMode)((analogRefRegVal >> moduleShiftVal) & 1U);
    refVoltage = (ADC_ReferenceVoltage)((analogRefRegVal >>
                 (ADC_VOLTAGE_REF_REG_OFFSET + moduleShiftVal)) & 1U);

    //
    // Offset trim for internal VREF 3.3V is unique and stored in upper byte.
    //
    if((refMode == ADC_REFERENCE_INTERNAL) &&
       (refVoltage == ADC_REFERENCE_3_3V))
    {
        offsetShiftVal = 8U;
    }
    else
    {
        offsetShiftVal = 0U;
    }

    //
    // Set up pointer to offset trim in OTP.
    //
    uint32_t *offsetKey;

    offsetKey = (uint32_t *)ADC_OFFSET_TRIM_KEY_OTP_MP3;

    if(*offsetKey == TI_OTP_DEV_KEY)
    {
        offset = (uint16_t *)(ADC_OFFSET_TRIM_OTP_ADCA_MP3 + moduleShiftVal);
    }
    else
    {
        offsetKey = (uint32_t *)ADC_OFFSET_TRIM_KEY_OTP_MP1;
        if(*offsetKey == TI_OTP_DEV_KEY)
        {
            offset = (uint16_t *)(ADC_OFFSET_TRIM_OTP_ADCA_MP1 +
                                    moduleShiftVal);
        }
        else
        {
            *offset = 0U;
        }
    }

    //
    // Get offset trim from OTP and write it to the register.
    //
    EALLOW;
    HWREGH(base + ADC_O_OFFTRIM) = (*offset >> offsetShiftVal) & 0xFFU;
    EDIS;
}

此致、

赞讷

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Zane:

    感谢您报告此问题。 确实存在在这个代码中取消引用一个未初始化指针的风险。 我们的软件团队将在下一个版本中修复该问题。

    伊袋

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Ibukun:

    我是否可以 使用以下定义:

    uint16_t *偏移= NULL;  

    此致、

    赞讷

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Zane:

    从技术上讲、您永远不应遇到故障情况、因为只有在器件未通过工厂修整时才会满足故障条件。  

    也就是说,这个 bug 实际上是一个错别字——它不应该被理解为无效:

            else
            {
                offset = 0U;
            }

    此致、
    伊袋