gpt4 book ai didi

c - 不安全的转换

转载 作者:太空狗 更新时间:2023-10-29 14:58:22 25 4
gpt4 key购买 nike

下面的转换安全吗?

int b[10][10];
char *x;
int a[]={0,1,2,3,4,5,6,7,8,9};

for(int i=0;i<10;i++)
for(int j=0;j<10;j++)
b[i][j]=a[i];

for(x=(char *)&b[0];x<=(char *)&b[9][9];x+=sizeof(a+1)) // Problem lies here!
printf("%d\n",*x);

我认为 for 循环中的上述转换是不安全的(我认为它是平台相关的)。如果我错了,请纠正我。我很惊讶,因为即使在 gcc 中使用 -Wall -pedantic 选项进行编译,代码也不会发出任何警告。

最佳答案

这整件事有一个合法的机会,原因只有一个:二维 int 数组对象被重新解释为 char 对象的数组。虽然在一般情况下内存重新解释会导致未定义的行为,但语言规范明确允许对任何类型的对象进行“[signed/unsigned] char 数组”重新解释。

但是,一个正式的安全问题仍然存在。该语言不保证任何位模式都是 char 类型的有效值。如果您尝试通过 char 类型读取重新解释的内存,如果遇到 char 的陷阱表示,理论上会导致未定义的行为。为了安全起见,您必须使用 unsigned char 类型,这是唯一没有陷阱表示的类型。当然,具有诱人的 char 的平台可以安全地称为“exotic”。

与此同时,您的 sizeof(a + 1) 似乎没有任何意义。 a + 1 是一个int * 类型的表达式。我不清楚在这种情况下为什么要使用指针大小来增加 x 值。你想达到什么目的?

至于没有警告……我不希望编译器在这里发出任何警告。 GCC 经常警告类型双关(又名内存重新解释),但由于 char 重新解释是明确允许的(正如我上面所说的),这里没有警告。此外,显式强制转换通常倾向于抑制任何警告,因为它们是一种告诉编译器您确实想要做某事的方式,无论它可能有多么错误和/或危险。

关于c - 不安全的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2211787/

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