From mboxrd@z Thu Jan 1 00:00:00 1970 X-Msuck: nntp://news.gmane.org/gmane.linux.lib.musl.general/171 Path: news.gmane.org!not-for-mail From: =?UTF-8?B?THVrYSBNYXLEjWV0acSH?= Newsgroups: gmane.linux.lib.musl.general Subject: Re: cluts - numeric test expectations Date: Fri, 15 Jul 2011 13:44:57 +0200 Message-ID: <4E202839.8030103@gmail.com> References: <20110715033729.GP16618@brightrain.aerifal.cx> Reply-To: musl@lists.openwall.com NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: multipart/alternative; boundary="------------090304000400000407080106" X-Trace: dough.gmane.org 1310730406 16469 80.91.229.12 (15 Jul 2011 11:46:46 GMT) X-Complaints-To: usenet@dough.gmane.org NNTP-Posting-Date: Fri, 15 Jul 2011 11:46:46 +0000 (UTC) To: musl@lists.openwall.com Original-X-From: musl-return-255-gllmg-musl=m.gmane.org@lists.openwall.com Fri Jul 15 13:46:42 2011 Return-path: Envelope-to: gllmg-musl@lo.gmane.org Original-Received: from mother.openwall.net ([195.42.179.200]) by lo.gmane.org with smtp (Exim 4.69) (envelope-from ) id 1Qhgqv-0000Hs-Qp for gllmg-musl@lo.gmane.org; Fri, 15 Jul 2011 13:46:41 +0200 Original-Received: (qmail 22515 invoked by uid 550); 15 Jul 2011 11:46:41 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: Original-Received: (qmail 22507 invoked from network); 15 Jul 2011 11:46:40 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=message-id:date:from:user-agent:mime-version:to:subject:references :in-reply-to:content-type; bh=lD4inD3IGGyGK6VKUVBOJHY7GvJ9jo3qhqPxkY5ovcs=; b=e+5f+vf7lQvdENGUxbHszDhtS9lynY9Jylyt7mP88RY0jHoBJXpGb3rTjlebBH9ND6 92bUOB0wHM47g5B8aUKipp4cjRjR8z3tFl1Cw0Q+sHu1dcIKizSmpR3uHiSLLjfSNz/7 7CoFovUOGgsAvhgZblG2aESSYYFnd+DD5rE/0= User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.18) Gecko/20110626 Icedove/3.1.11 In-Reply-To: <20110715033729.GP16618@brightrain.aerifal.cx> Xref: news.gmane.org gmane.linux.lib.musl.general:171 Archived-At: This is a multi-part message in MIME format. --------------090304000400000407080106 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 07/15/2011 05:37 AM, Rich Felker wrote: > Tests which expect strto* on "0x[junk]" to fail rather than returning > 0 with endptr pointing at the 'x': both my interpretation of the > standard and glibc agree that this expectation is wrong, as does at > least one expert I asked. I think these should be changed to accept > the current musl and glibc behavior and treat anything else as a > failure. (Note that the scanf tests, however, seem to be fine.) For those who missed the chat: We talked about non-base-16 tests which do expect endptr to end up pointing at 'x'. Rich's argument against this behavior was "longest initial subsequence" (strlen of "0x">"0"), and mine was "of the expected form" [see strtol SUSv4 page to see what I mean]. We ended up agreeing on the latter. It follows that the above objection of Rich's is to hexadecimal "0x*" tests. Rich: Now that you pointed it out, I do believe that the standard applies this logic to base-16 tests as well, because of this one line: "If the value of/base /is 16, the characters 0x or 0X may optionally precede the sequence of letters and digits". The key word here is "optionally". I guess I missed this, expecting base 16 to take only "A hexadecimal constant [which] consists of the prefix 0x or 0X followed by a sequence of the decimal digits and letters". But the latter definition (without optionality), refers to cases where base is 0, not 16. One might think that base 0 should then match "0x", but I don't think so - it brings us back to "expected from". In short: I think, like Rich said, absolutely all "0x" tests should point to 'x'. Any objections? Speak now or forever hold your peace*. *where 'forever' is a definite (quite possibly short) amount of time ;-) > Tests which expect *endptr==str after overflow (ERANGE): I believe > this expectation is incorrect, but glibc seems to disagree. I can't > find any language in the standard to support the behavior explicitly, > or to allow it as an interpretation. The definition of "subject > sequence" makes no reference to the value having to fit in a > certain-size integer type, Though I did remake ERANGE tests (see "> MAX" commit) with the endptr-nptr offset strlen of nptr, I've now reviewed the case, and I think it should still be endptr==nptr. There is no actual conversion in my opinion: *_MAX returned value simply means out of scope. See "Return value" section: "Upon successful completion, these functions shall return the converted value". The reason I say it's not a converted value is because successful completion it is not, see "Errors" section: "These functions shall fail if: (...) [ERANGE] The value to be returned is not representable.". Not that I can't see con arguments. > only that it belong to a clearly-defined > regular language, e.g. /[-+]?(0x)?[[:xdigit:]]+/ for base==16. Is that your regexp or an official one (if there is such a thing)? Because I think, in light of what you've said above regarding the first issue, it might be wrong: Wouldn't this regexp greedily match "0x" for you, instead of the shorter [[:xdigit:]], the latter of which is alone of the "expected form"? > Otherwise, all the integer tests look okay. I still need to review the > floating point ones. > > Rich I appreciate that. -Luka --------------090304000400000407080106 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: 8bit On 07/15/2011 05:37 AM, Rich Felker wrote:
Tests which expect strto* on "0x[junk]" to fail rather than returning
0 with endptr pointing at the 'x': both my interpretation of the
standard and glibc agree that this expectation is wrong, as does at
least one expert I asked. I think these should be changed to accept
the current musl and glibc behavior and treat anything else as a
failure. (Note that the scanf tests, however, seem to be fine.)

For those who missed the chat: We talked about non-base-16 tests which do expect endptr to end up pointing at 'x'. Rich's argument against this behavior was "longest initial subsequence" (strlen of "0x">"0"), and mine was "of the expected form" [see strtol SUSv4 page to see what I mean]. We ended up agreeing on the latter. It follows that the above objection of Rich's is to hexadecimal "0x*" tests.
Rich: Now that you pointed it out, I do believe that the standard applies this logic to base-16 tests as well, because of this one line: "If the value of base is 16, the characters 0x or 0X may optionally precede the sequence of letters and digits". The key word here is "optionally". I guess I missed this, expecting base 16 to take only "A hexadecimal constant [which] consists of the prefix 0x or 0X followed by a sequence of the decimal digits and letters". But the latter definition (without optionality), refers to cases where base is 0, not 16. One might think that base 0 should then match "0x", but I don't think so - it brings us back to "expected from".
In short: I think, like Rich said, absolutely all "0x" tests should point to 'x'. Any objections? Speak now or forever hold your peace*.
*where 'forever' is a definite (quite possibly short) amount of time ;-)

Tests which expect *endptr==str after overflow (ERANGE): I believe
this expectation is incorrect, but glibc seems to disagree. I can't
find any language in the standard to support the behavior explicitly,
or to allow it as an interpretation. The definition of "subject
sequence" makes no reference to the value having to fit in a
certain-size integer type,

Though I did remake ERANGE tests (see "> MAX" commit) with the endptr-nptr offset strlen of nptr, I've now reviewed the case, and I think it should still be endptr==nptr. There is no actual conversion in my opinion: *_MAX returned value simply means out of scope. See  "Return value" section: "Upon successful completion, these functions shall return the converted value". The reason I say it's not a converted value is because successful completion it is not, see "Errors" section: "These functions shall fail if: (...) [ERANGE] The value to be returned is not representable.". Not that I can't see con arguments.

 only that it belong to a clearly-defined
regular language, e.g. /[-+]?(0x)?[[:xdigit:]]+/ for base==16.

Is that your regexp or an official one (if there is such a thing)? Because I think, in light of what you've said above regarding the first issue, it might be wrong: Wouldn't this regexp greedily match "0x" for you, instead of the shorter [[:xdigit:]], the latter of which is alone of the "expected form"?

Otherwise, all the integer tests look okay. I still need to review the
floating point ones.

Rich

I appreciate that.
-Luka
--------------090304000400000407080106--