2015-10-01 17 views
0

的如下是由glibc的实现的功能strtoulstdlib.h的描述:glibc中strtoul的实现是否与C11标准冲突?

功能:unsigned long int类型strtoul将(常量字符* retrict字符串,字符**限制tailptr,INT基) 初步:| MT-Safe locale | AS-Safe | AC-Safe |请参阅POSIX安全概念。

strtoul(“string-to-unsigned-long”)函数与strtol类似,只是它转换为无符号的long int值。语法与上面描述的strtol相同。溢出时返回的值为ULONG_MAX(请参阅类型的范围)。

如果字符串表示负数,strtoul与strtol的作用相同,但会将结果转换为无符号整数。这意味着例如“-1”上的strtoul返回ULONG_MAX并且输入比LONG_MIN返回的负(ULONG_MAX + 1)/ 2更负。

如果base超出范围,或者ERANGE溢出,strtoul会将errno设置为EINVAL。

这意味着,例如,"-2"将被转换为ULONG_MAX - 1。但C11标准[7.22.1.4-8]表示:

的strtol将,与strtoll,strtoul将和strtoull将函数返回转换 值,如果有的话。如果不能执行转换,则返回零。 如果正确值超出可表示值的范围,则返回LONG_MIN,LONG_MAX,LLONG_MIN,LLONG_MAX,ULONG_MAX或ULLONG_MAX(根据返回类型和值的符号,如果有的话),以及宏的值ERANGE存储在errno中。

因此,按照标准,例如,"-2"应转换为ULONG_MAX。这是冲突吗?

+0

请注意,glibc跟C标准更接近[posix](http://pubs.opengroup.org/onlinepubs/9699919799/)。然而,C11 7.22.1.4.5似乎也处理了 - 符号,虽然我不清楚这种否定是否应该在引用7.22.1.4-8之前发生。 – nos

+0

@nos,谢谢,但作为我回复chux的时候,即使发生在溢出转换之后,仍然存在冲突。 – xskxzr

回答

1

这可能是glibc在标准化发生之前实现功能的另一种情况。

是的它冲突。

但是,我认为glibc的结果更有用。如果您需要完美的合规性,则可以封装该功能以执行转换。

+0

谢谢。我赞同你。你知道在哪里报告这个错误? – xskxzr

+0

@Shenke:取决于。如果错误在标准中,那么不清楚在哪里报告。如果你认为glibc有bug,那么就需要有一些说服力,用新标准来替代他们的标准。改变可能会破坏许多现有的用途。 – wallyk

3

没有冲突。

如果主题序列与一个减号开始,从 所得的转化的值(在返回类型)时取消。 C11dr§7.22.1.45

unsigned否定是明确的。

涉及无符号的操作数的一种计算可以永远不会溢出,因为不能由所得到的无符号整数类型所表示的结果是减少了模比可以由所得到的类型表示的最大值大一个数量。 6.2节。5 9

按照标准,“-2”应转换为ULONG_MAX - 2

所以也许“功能:无符号长......溢出”的文字与以某种方式C时的参数(特别是“输入比LONG_MIN回报(ULONG_MAX + 1)/2更负)”的冲突,但strtoul()功能是正确的。

+0

谢谢。正如@nos所说,我不知道在我引用的溢出转换之前或之后否定是否发生。但是,即使它发生在溢出转换之后,正如您所说的那样,输入上的冲突可能比LONG_MIN更负,例如 - ULONG_MAX(实现将返回(ULONG_MAX + 1)/ 2,而它应该是1由标准)。 – xskxzr

+0

@ Shenke我刚刚在32位和64位主机上测试过,它返回1. – nos

+0

@nos我很困惑。看起来glibc的真正实现与它所记录的不完全相同。文件太旧了吗?我在这个网站上找到它:https://www.gnu.org/software/libc/manual/html_mono/libc.html – xskxzr

相关问题