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.

[参考译文] AM2434:AM2434:INDUSTRIAL-COMMUNICATIONS-SDK - AM243X v11.00.00.xx、EthertNet/IP、drv_uart.c 示例模块中的错误

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1577731/am2434-am2434-industrial-communications-sdk-am243x-v11-00-00-xx-ethertnet-ip-bug-in-drv_uart-c-example-module

器件型号:AM2434


您好:

我在函数中看到了另一个错误
void DRV_UART_printf (void * pContext、const char* pFormat、va_list arg);“
存在于中
“C:\ti\ind_comms_sdk_am243x_11_00_00_13\examples\industrial_comms\EtherNetIP_adapter_demo\drivers\uart\drv_uart.c“  

此函数应将临时缓冲区“tmpString[]"中“中的数据以原子方式放入循环缓冲区“aOutStream"中“中、即全部或无任何内容。

在单次写入 (memcpy) 的情况下、满足此条件。 在两次写入的情况下,实际上只执行第一部分,其余部分不适合,这是一个错误。

为了解决这个问题、我建议针对写入循环缓冲区的条件采用以下解决方案。 请将此代码片段转发给您的开发团队。

我请求此函数具有相同的行为,当缓冲区为循环且几乎已满时,其行为方式相同 — 放置所有数据或不放置任何数据(任何时候)!

此致、
维特·特里斯卡

Ethernetip_example_drv_uart_fixed_DRV_uart_printf.c 

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

    你好、Vit、

    感谢您发送编修。 我们的路线图中包含 UART 驱动程序的重构;但是、在即将发布的版本中、我们将只解决与 DRV_UART_printf 函数内使用静态数组相关的关键错误。 所有其他错误(潜在的缓冲区溢出,互斥处理问题等)都将在未来的版本中解决。

    关于建议的代码,虽然它确实是一个更好的实现,但仍然存在一个与 vsnprintf () 的返回值相关的潜在错误。 此函数的返回值表示如果缓冲区足够大(不包括空终结符)、将写入缓冲区的字符数。 如果返回值大于或等于缓冲区大小、则表示缓冲区太小、无法容纳整个格式化字符串、这可能会在后续 memcpy () 操作期间导致缓冲区溢出。

    此致、
    Pourya

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    关于您建议的代码,虽然它确实是一个更好的实现,但仍然有一个与 vsnprintf () 的返回值相关的潜在错误。 此函数的返回值表示如果缓冲区足够大(不包括空终结符)、将写入缓冲区的字符数。 如果返回值大于或等于缓冲区大小、则表示缓冲区太小、无法容纳整个格式化字符串、这可能会在后续 memcpy () 操作期间导致缓冲区溢出。 [/报价]


    是的、您正在讨论:

      char tmpString[76]; // TODO 会将 ME 修复为 256(修复 TI EtherNet/IP 库栈溢出之后)
      bytesToWrite = vsnprintf (tmpString、sizeof (tmpString)、pFormat、arg);
      if (bytesToWrite > 0)
      {...}


    很棒的捕捉!!!

    正确的条件是:
      if (bytesToWrite > 0 && bytesToWrite < sizeof (tmpString))
      {...}

    我假设你有一个非标准的 vsnprintf () 方法实现,所以我把这个问题留给了…
    我没想到一个函数中有 3 个错误,事实上:D


    谢谢!