检查缓冲区是否交错-定义的行为?

问题描述 投票:0回答:1

假设我需要一个函数,该函数检查两个任意缓冲区是否交错*。我想到的一个简单的主意是:

bool isInterleaved(uint* buf1, // pointer to first buffer
                   uint* buf2, // pointer to second buffer
                   uint len1,  // length of first buffer
                   uint len2,  // length of second buffer
                   uint stride1, // stride length of first buffer
                   uint stride2) // stride length of second buffer
{
    ... // first some sanity checks like (NULL != buf), (0U < len),...

    bool retval = false;
    if ((len1 == len2) && (2U == stride1) && (2U == stride2))
    {
        if ((&buf1[1] == &buf2[0])  ||
            (&buf2[1] == &buf1[0]))
        {
            retval = true;
        }
    }
    return retval;
}

在纸面上,它看起来足够好,快速测试是肯定的。但是,In C and C++, the comparison of pointers to objects is only strictly defined if the pointers point to members of the same object, or elements of the same array.

我的示例-特别是带有(&buf1[1] == &buf2[0])的行和后面的行-构成未定义的行为吗?如果是,如何在不依赖未定义行为的情况下执行这样的检查?


*请参阅编辑历史记录以获取交错数据的示例,或检查wikipedia article on interleaving。正如评论所暗示的,这不是一个“错误的词”。

c undefined-behavior c99
1个回答
2
投票

我的示例构成未定义的行为吗?

所提供的代码没有未定义的行为。指针可以与==进行比较。即使它们指向不同的对象。

您要引用的规则适用于<><=>=运算符。在“不同对象”上使用这些运算符是未定义的行为。在指针上的关系运算符的标准语义的草案可以在C99 6.5.8p5中找到。

© www.soinside.com 2019 - 2024. All rights reserved.