memcmp 应该 return 到底是什么?

What, exactly, is memcmp supposed to return?

我想知道函数 memcmp 必须 return。

我一直在 Internet 上搜索,通常 memcmp 定义如下所示:

The memcmp() function returns an integer greater than, equal to, or less than zero, accordingly as the object pointed to by s1 is greater than, equal to, or less than the object pointed to by s2.

从来没有明确说明 确切地 是 returned:它是两个字节值之间的差异,还是 -1、0 或 1 ?我很困惑:

因为我无法得到函数 memcmp 的足够精确的定义,所以我在这里问这个问题:函数 memcmp 应该 return 到底是什么?某处有 "official" 源代码吗? (我看过很多memcmp的源代码但是none给了我一个答案:我然后假设它们不是库string.h中写的函数,至少不是在我的电脑上...)

正如@EugeneSh 所说,它没有定义。 POSIX specification 说,除了你引用的部分:

The sign of a non-zero return value shall be determined by the sign of the difference between the values of the first pair of bytes (both interpreted as type unsigned char) that differ in the objects being compared.

因此,只有 zero/nonzero 和 positive/negative 是适用于 memcmp 中的 return 值的有意义的测试。不要依赖实际值,因为它们可能在不同的 C 库(甚至处理器架构)之间有所不同。

来源示例

我找到了有人放在 GitHub 上的 GNU C 库 (glibc) 的镜像。 source for memcmp取两个字节的差值(第332行),所以return的值一般不会只有-1或+1。然而,一个特定的库可能会实现 memcmp 但是对目标平台最有意义。

memcmp() 编辑的特定值 return 未由标准指定。 C11 标准草案确实在 §7.24.4 1 中说:

The sign of a nonzero value returned by the comparison functions memcmp, strcmp, and strncmp is determined by the sign of the difference between the values of the first pair of characters (both interpreted as unsigned char) that differ in the objects being compared.

因此只有来自比较函数的非零 return 值的符号才是有意义的。此处给出的自由度允许每个实现按其认为合适的方式解释这些要求。

另外,注意没有"official source code";标准是 C 实现必须遵守的文档。即使阅读用于查找用于生成 memcmp() return 值的底层方法的实现的源代码,在代码中使用这些值充其量也是不可移植的,并且很容易受到未来的攻击该实施的变化。

不指定return是什么整数,指定结果可以与0比较。

任何值 return 如果实现完成此测试,则它是正确的。

未指定确切结果的原因是

首先,确切的结果并不重要。调用者只需要知道三个结果之一 <=>。定义的行为有效。现在规范可以说 return -1、0 或 1。那么为什么不说这很重要。见第二点

其次。通过不指定确切的结果,实现者可以编写非常高效的代码。 memcmp 可以通过计算位数或做一些巧妙的操作来实现。要么。自然不会产生 1 或 -1 的 xor 等。所以规范对确切的 return 值保持沉默。