【发布时间】:2013-06-04 21:24:45
【问题描述】:
按照strtol的规范:
如果主题序列具有预期的形式并且base 的值为0,则从第一个数字开始的字符序列应被解释为整数常量。如果主题序列具有预期的形式并且碱基的值在 2 到 36 之间,则应将其用作转换的碱基,并为每个字母赋予其值,如上所示。如果主题序列以减号开头,则转换产生的值应取反。指向最终字符串的指针应存储在 endptr 指向的对象中,前提是 endptr 不是空指针。
目前的问题是,在否定之前,该值不在long 的范围内。例如,在 C89 中(整数常量不能采用 long long 类型),写 -2147483648 可能是溢出;你必须写(-2147483647-1) 或类似的。
由于使用“整数常量”的措辞可以解释为将 C 规则应用于整数常量的类型,这可能足以让我们避免此处未定义的行为,但同样的问题(没有这么简单的问题)将适用于strtoll。
编辑:最后,请注意,即使它确实溢出了,也应该返回“正确”的值。所以这个问题实际上只是关于在这种情况下是否可以或必须设置errno。
【问题讨论】:
-
为什么不将问题更新为仅通过运行代码无法确定的问题 - 而不是仅在底部进行编辑。
-
像这样的问题本质上是无法通过运行代码来回答的。这是一个关于C语言要求的问题(见
language-lawyer标签)。 -
这个问题是在 comp.std.c 中提出的 groups.google.com/d/msg/comp.std.c/KOVzuLFen6Q/x2laO7KPCJ4J 和 C 委员会成员 Lawrence Jones 说
errno没有设置为ERANGE。 -
@R.. 我建议您将问题的标题更改为无法通过测试来完成的事情,您只能在底部进行编辑。
-
标题是溢出这个词的正确用法。在大多数情况下,“X 是否溢出?”通过测试可以得到肯定的回答,但不能得到否定的回答;由于溢出通常会导致未定义的行为,因此测试永远无法确定没有发生溢出。在
strtol的情况下,如果发生“溢出”,它将在实现内部,并且函数需要通过errno报告,所以这应该可以在任一方向进行测试,但是测试不是回答有关 C 语言的问题,但有关特定实现的问题可能正确也可能不正确。
标签: c language-lawyer integer-overflow