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)已用于其他变量并覆盖它可能会导致故障.
您怎么看?这样的代码可以使用还是错误的方式,永远不应该使用?
从这个评论
/* 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指针的来源,验证它始终保证满足要求,然后确保您不会破坏指针通过代码的过程中的任何内容.
| 归档时间: |
|
| 查看次数: |
317 次 |
| 最近记录: |