我正在浏览一个代码库,它使用 Chan 的 FatFS 库,并且可能是使用 CubeMX 代码生成器开发的。我可以看到下面给出的代码。 STM32 用户手册 UM1721
中也有描述结构体定义如下:
typedef struct
{
uint8_t is_initialized[_VOLUMES];
Diskio_drvTypeDef *drv[_VOLUMES];
__IO uint8_t nbr;
}Disk_drvTypeDef;
disk
是一个全局变量,定义为:
Disk_drvTypeDef disk = {0};
函数定义如下:
uint8_t FATFS_LinkDriver(Diskio_drvTypeDef *drv, char *path)
{
uint8_t ret = 1;
uint8_t DiskNum = 0;
if(disk.nbr <= _VOLUMES)
{
disk.is_initialized[disk.nbr] = 0;
disk.drv[disk.nbr] = drv;
DiskNum = disk.nbr++;
path[0] = DiskNum + '0';
path[1] = ':';
path[2] = '/';
path[3] = 0;
ret = 0;
}
return ret;
}
我的问题是当
disk.nbr == _VOLUMES
调用 FATFS_LinkDriver
函数时会发生什么。它不会尝试将 drv
放入 disk.drv[_VOLUMES]
中吗?但 disk.drv
的尺寸为 _VOLUMES
。那么最大索引不应该比这个小1吗?我是不是错过了什么?
此代码调用此行中未定义的行为:
disk.drv[disk.nbr] = drv;
当
disk.nbr == _VOLUMES
时。
STM32 FATFS 用户手册 (um1721) 中的这段代码正确吗?
不,不是。一般说明 - 不保证文档中找到的代码是正确的。