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.

[参考译文] CC2530:对 ZNP/Z-Stack 3.0.2执行 ccpcheck

Guru**** 2564565 points
Other Parts Discussed in Thread: Z-STACK

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

https://e2e.ti.com/support/wireless-connectivity/zigbee-thread-group/zigbee-and-thread/f/zigbee-thread-forum/955495/cc2530-ccpcheck-on-znp-z-stack-3-0-2

器件型号:CC2530
Thread 中讨论的其他器件:Z-stack

您好!

我对 Z-Stack 3.0.2代码运行了'cpcheck'、并收到了一个有趣的通知:

[组件/osal/common/OSAL_Memory.c:454]:(错误)在索引8处访问的阵列'proCur[8],超出范围。
[组件/osal/common/OSAL_Memory.c:455]:(错误)在索引8处访问的阵列'proCur[8]、超出范围。
[组件/osal/common/OSAL_Memory.c:550]:(错误)在索引8处访问的阵列"proCur[8]"超出范围。
[组件/osal/common/OSAL_Memory.c:455]:(错误)在索引8处访问的阵列"proMax[8]"超出范围。 

这是唯一有效的警告、另一种是误报。  这不算太糟糕、但它在一个关键功能内。

如果 HDR->HDR.len 始终超过 proCnt[idx]、"idx"值将达到"OSALMEM_PROMAX"、并且超出数组边界。

建议的修复方法是什么?

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

    您好、LE_TOP、

    以下内容包含在 osal_mem_alloc 中:

    #if OSALMEM_Profiler
    #define OSALMEM_PROMAX 8
    //性能评测桶必须至少有 OSALMEM_MIN_BLKSZ 不同;
    *最后一个段必须等于最大的 alloc 大小。 将存储桶大小设置为
    *显示应用程序如何使用存储器所需的任何大小。
    */
    静态 uint16 proCnt[OSALMEM_PROMAX]={
    OSALMEM_SMall_BLKSZ、48、112、176、192、 224、256、65535};
    静态 uint16 proCur[OSALMEM_PROMAX]={0};
    静态 uint16 proMax[OSALMEM_PROMAX]={0};
    静态 uint16 proTot[OSALMEM_PROMAX]={0};
    静态 uint16 proallBlkmiss;
    #endif 
    对于(idx = 0;idx < OSALMEM_PROMAX;idx++)
    {
    if (hdr->hdr.len <= proCnt[idx])
    {
    中断;
    }
    }
    proCur[idx]++;
    if (proMax[idx]< proCur[idx])
    {
    proMax[idx]= proCur[idx];
    }
    proTot[idx]++; 

    我假设在某些情况下、idx 在中断前可能会达到 for 循环的极限、在本例中、它的值将为9 8、因此对于随后的 proCur/proMax/proTot 计算而言、它是无效的条目。  在这种情况下、可能应跳过这些计算。  只有 在定义了 OSALMEM_Profiler 时才会发生这种情况。

    此致、
    Ryan

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

    您好、Ryan

    idx 的无效值将是8、但由于算法的所有信息现在都在一个位置、因此可以看到 proCnt 的最后一个值是65535、这是 uint16最大值、因此循环在7处中断。

    不过、最好调整环路的限制。

    在实践中,最后没有问题;-)。

    BR、

    Mario