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

Mis*_*lab 3 c pointers unsafe-pointers

分析一些代码:

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;
Run Code Online (Sandbox Code Playgroud)

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

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

Use*_*ess 7

从这个评论

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

我们可以推断该函数期望调用者保证这一点.在这种情况下,如果调用者满足要求,代码是安全的.

如果主叫方没有不保证这一点,该功能是不是安全的.这就像您无法有效检查的任何其他先决条件一样:如果违反了要求,则它们具有UB,这是调用者的错误.

为了比较,free()如果你违反了返回其指针参数的先决条件,可能会有类似的行为(并且可能会出现更糟糕的副作用)malloc()/realloc().

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

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

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

它可以安全使用,就像free()可以安全使用一样.它可以以错误的方式使用,就像free()可能被滥用一样.永远不要使用这样的代码的唯一原因是你不相信自己正确使用它.


实用的建议是查看此pucFrame指针的来源,验证它始终保证满足要​​求,然后确保您不会破坏指针通过代码的过程中的任何内容.