gpt4 book ai didi

c - 将越界索引与从足够大的数组转换而来的较小数组一起使用是否安全?

转载 作者:行者123 更新时间:2023-12-04 11:42:41 25 4
gpt4 key购买 nike

在我的日常工作中,我遇到过很多类似于以下模式的 C 代码。我担心这种模式是否安全。

typedef struct
{
unsigned char someField : 4;
unsigned char someOtherField : 4;
unsigned char body[1];
} __attribute__((__packed__, aligned(1))) SomeStruct;

int main()
{
unsigned char pack[16] = {};
SomeStruct* structPack = (SomeStruct*)pack;

structPack->someField = 0xC;
structPack->body[4] = 0x5;

return 0;
}

让我担心的是,程序使用了structPack->body[4],它仍然是16字节数组的一部分,但如果我们看一下,它就是越界的SomeStruct 的定义。所以有两种看待它的方式:

  • 它指的是一个有效的内存位置。没有危险。
  • 它是越界的,因此是未定义的行为。

所以,我的问题是:

  1. 根据 C 标准(更具体地说,C89),此模式是安全的还是未定义的行为?
  2. 此外,对于某些特定的编译器(尤其是 GCC)或平台,它安全吗?
  3. 有更好的选择吗?

请注意,此类代码主要运行在微 Controller 上,有时作为应用程序运行在 Linux 桌面上。

最佳答案

通过不兼容的左值访问对象是未定义的行为。对齐可以通过你的属性行来解决,但是使用指针访问对象仍然违反了严格的别名:

unsigned char pack[16] = {};
SomeStruct* structPack = (SomeStruct*)pack;

6.5. p7:

An object shall have its stored value accessed only by an lvalue expression that has one of the following types:

— a type compatible with the effective type of the object,

— a qualified version of a type compatible with the effective type of the object,

— a type that is the signed or unsigned type corresponding to the effective type of the object,

— a type that is the signed or unsigned type corresponding to a qualified version of the effective type of the object,

— an aggregate or union type that includes one of the aforementioned types among its members (including, recursively, a member of a subaggregate or contained union), or

— a character type.

有效类型是:

The effective type of an object for an access to its stored value is the declared type of the object, if any.

SomeStruct* 与 char 数组不兼容。

分配 SomeStruct 的正确方法是使用内存分配器,或者如果支持该函数,则使用 alloca(如果需要,它将分配堆栈)。

仍然存在 body 成员的问题,它是一个大小为 1 的数组,标准不允许越界访问它(即 body[1] )。 c99引入了一个解决方案,就是灵活的数组成员:

typedef struct
{
unsigned char someField : 4;
unsigned char someOtherField : 4;
unsigned char body[]; //must be last
}...

当您设置大小以分配此结构时,您会添加额外的大小,具体取决于 body[] 成员需要的大小。

关于c - 将越界索引与从足够大的数组转换而来的较小数组一起使用是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26835481/

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