gpt4 book ai didi

c指针递减安全/不安全?

转载 作者:太空狗 更新时间:2023-10-29 15:54:07 26 4
gpt4 key购买 nike

分析一些代码:

static volatile UCHAR *pucSndBufferCur;

eMBErrorCode eMBRTUSend( UCHAR ucSlaveAddress, const UCHAR * pucFrame, USHORT usLength )
{
if( eRcvState == STATE_RX_IDLE )
{
/* First byte before the Modbus-PDU is the slave address. */
pucSndBufferCur = ( UCHAR * ) pucFrame - 1;

/* Now copy the Modbus-PDU into the Modbus-Serial-Line-PDU. */
pucSndBufferCur[0] = ucSlaveAddress;

看起来不安全,如果地址 (pucFrame - 1) 中的内存已被其他变量使用并覆盖它可能会导致故障怎么办。

您怎么看,这样的代码是可以使用还是以错误的方式使用,永远不应该使用?

最佳答案

来自这条评论

    /* First byte before the Modbus-PDU is the slave address. */
pucSndBufferCur = ( UCHAR * ) pucFrame - 1;

我们可能会推断该函数希望调用者保证这一点。在那种情况下,如果调用者满足要求,那么代码是安全的。

如果调用者保证这一点,则该函数安全。这就像您无法有效检查的任何其他先决条件一样:如果违反要求,他们就会有 UB,这是调用者的错

作为比较,如果您违反了从 malloc()/重新分配()

It looks like unsafe, what if memory in address (pucFrame - 1 ) is already used for other variable and overwriting it could cause malfunctions

不安全 - 它是 C。正确使用它的责任在你。如果你错误地使用它(传递一个不符合规定要求的指针),就会出现故障,这将是你的错。

What do you think, is code like this can be used or its wrong way and never should be used ?

可以安全使用,就像free()可以安全使用一样。它可以被错误地使用,就像 free() 可以被误用一样。 从不使用这样的代码的唯一原因是您不相信自己能够正确使用它。


实用的建议是查看这个 pucFrame 指针的来源,验证它始终保证满足要​​求,然后确保在指针的整个过程中没有破坏任何东西你的代码。

关于c指针递减安全/不安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48864742/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com