gpt4 book ai didi

混淆代码以使用限制限定符

转载 作者:行者123 更新时间:2023-12-04 05:33:40 27 4
gpt4 key购买 nike

我正在尝试调整以下版本的 stpcpy要使用的函数 restrict -qualified 指针作为其参数和内部,但我不确定简单地添加限定符是否会导致引入未定义的行为。

#define ALIGN (sizeof(size_t)-1)
#define ONES ((size_t)-1/UCHAR_MAX)
#define HIGHS (ONES * (UCHAR_MAX/2+1))
#define HASZERO(x) ((x)-ONES & ~(x) & HIGHS)

char *__stpcpy(char *d, const char *s)
{
size_t *wd;
const size_t *ws;

if (((uintptr_t)s & ALIGN) == ((uintptr_t)d & ALIGN)) {
for (; (*d=*s) && ((uintptr_t)s & ALIGN); s++, d++);
if (!*s) return d;
wd=(void *)d; ws=(const void *)s;
for (; !HASZERO(*ws); *wd++ = *ws++);
d=(void *)wd; s=(const void *)ws;
}
for (; (*d=*s); s++, d++);

return d;
}

假设 C99 6.7.3.1 中关于访问对象的规则仅适用于访问的单个对象而不是整个数组,我认为这可能没问题,因为写入的元素仅访问一次,并且仅用于写入。但我对使用 restrict 感到很不舒服在这一点上,不想仅仅依靠我自己的判断。

最佳答案

为了符合标准,唯一的限制是所有指针表达式都可以操作函数通过 restrict 接收到的任何对象。指针应该基于该指针。它不需要指针表达式的类型相同。所以从这个意义上说,通过这些 size_t* 访问对象不是约束违规或 UB。

我不确定是否读取了您通过 *wd 修改的对象的一部分的值。与 *d不会别名,因为指针类型不同。但正如你所说,你不这样做,所以这应该是安全的。

顺便说一句,该代码做出了一个不一定可移植的重要假设,即 uintptr_t 的低位反射(reflect)您转换为它的指针的对齐属性。这可能适用于我们日常使用中遇到的所有架构,但标准无法保证。甚至 C11 也只说了一些关于“字节地址的倍数”的内容,而没有任何东西可以说明它是什么。

关于混淆代码以使用限制限定符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12255710/

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