【问题标题】:Safety: user-defined buffer pointers安全性:用户定义的缓冲区指针
【发布时间】:2022-08-18 18:59:59
【问题描述】:

我在库中有 3 个缓冲区,每个缓冲区用于单独的数据流。

目前,缓冲区的输入与设备上的数据纠缠在一起,但我想概括设备外数据的输入,以便在不进行预处理的情况下通过相同的算法推送。

我看到 2 个选项。

我最安全的选择是初始化库中的缓冲区并控制那里的缓冲区溢出。

#define BUFFSIZE 100
float buff[BUFFSIZE] = {0};
uint8_t bufferCount = 0;

uint8_t pushSampleToBuffer(float sample)
{
    if(bufferCount < BUFFSIZE)
    {
        buff[bufferCount] = sample;
        bufferCount++;
        return 0;
    }
    return 1;
}

另一种选择是使用缓冲区指针。 我认为这对于让用户访问他们自己的缓冲区而不复制它是非常可行的。

#define BUFFSIZE 100
float* algBuffPtr = NULL;
uint8_t algBuffSize = 0;

uint8_t initAlg(float* buffPtr, uint8_t buffSize)
{
    if((buffSize < BUFFSIZE) && (algBuffPtr != NULL))
    {
       algBuffSize = buffSize;
       algBuffPtr = buffPtr;
       return 0;
    }
    return 1;
}

有没有办法采用指针方法并更严格地验证指示的地址是否有效?

  • OT:为什么不将布尔值用于布尔值?为什么要使用 0(false 如果 C 将其解释为布尔值)来表示成功? - 什么样的 \”严格地\" 验证你想到了吗?你的目标系统能提供任何关于有效地址的信息吗?

标签: c embedded signal-processing buffer-overflow


【解决方案1】:

首先,如果您允许像将缓冲区实现为全局数组这样的脏东西,那么任何关于程序安全的讨论都是无关紧要的。至少将它们声明为static(解决封装但不解决线程安全问题)。

至于检查缓冲区溢出,数组和指针之间没有明显区别。也许除非是数组,否则您总是手头有基地址 - 如果您允许修改指针(不是const),使用指针时可能会或可能不会出现这种情况。

在嵌入式系统中,通常通过声明专用缓冲区来实现双/三/等缓冲,但始终通过指针访问它们。这样做的原因是性能 - 在例如“工作缓冲区”和“已验证缓冲区”之间切换时,您不必执行 memcpy 或其他 CPU 繁重的操作,您只需交换指针(以一种不受竞争条件影响的方式)。

内部处理大小和溢出检查的环形缓冲区 ADT 是另一种常见的解决方案。

【讨论】:

    猜你喜欢
    • 2015-09-02
    • 2015-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    • 1970-01-01
    • 2015-04-04
    • 2012-06-09
    相关资源
    最近更新 更多