From patchwork Tue Mar 28 20:06:47 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Paul A. Clarke" X-Patchwork-Id: 19745 Received: (qmail 91170 invoked by alias); 28 Mar 2017 20:06:59 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 91148 invoked by uid 89); 28 Mar 2017 20:06:58 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-27.6 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 spammy=margin, Position, H*Ad:U*pc, H*Ad:D*us.ibm.com X-HELO: mx0a-001b2d01.pphosted.com Reply-To: pc@us.ibm.com To: libc-alpha@sourceware.org From: Paul Clarke Subject: [PATCH] string/test-strncmp.c: Add comments within do_random_tests() Date: Tue, 28 Mar 2017 15:06:47 -0500 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.8.0 MIME-Version: 1.0 X-TM-AS-GCONF: 00 x-cbid: 17032820-0036-0000-0000-000001C4A2E0 X-IBM-SpamModules-Scores: X-IBM-SpamModules-Versions: BY=3.00006867; HX=3.00000240; KW=3.00000007; PH=3.00000004; SC=3.00000206; SDB=6.00840071; UDB=6.00413379; IPR=6.00617975; BA=6.00005245; NDR=6.00000001; ZLA=6.00000005; ZF=6.00000009; ZB=6.00000000; ZP=6.00000000; ZH=6.00000000; ZU=6.00000002; MB=3.00014842; XFM=3.00000013; UTC=2017-03-28 20:06:54 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 17032820-0037-0000-0000-00003F429400 Message-Id: <38bf371c-c7ae-8a5b-24f0-08d8ffce270f@us.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2017-03-28_16:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=1 malwarescore=0 phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1702020001 definitions=main-1703280165 I was about to throw this out after abandoning my attempts to "fix" string/test-strncmp.c (which didn't need fixing). However, since I added some comments which I found useful in navigating the code, I thought I should offer them for inclusion. -- 8< -- I added comments and rearranged some code to clarify the workings of do_random_tests() in the hope that someone new to the code will find it much more comprehensible than I did. 2017-03-28 Paul A. Clarke * string/test-strncmp.c (do_random_tests): Add comments and rearrange some code for readability. --- string/test-strncmp.c | 40 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/string/test-strncmp.c b/string/test-strncmp.c index fe3c4e3..dabf1f1 100644 --- a/string/test-strncmp.c +++ b/string/test-strncmp.c @@ -270,33 +270,58 @@ do_random_tests (void) size_t i, j, n, align1, align2, pos, len1, len2, size; int result; long r; + /* Get pointers near the end of a "page". */ UCHAR *p1 = (UCHAR *) (buf1 + page_size - 512 * CHARBYTES); UCHAR *p2 = (UCHAR *) (buf2 + page_size - 512 * CHARBYTES); for (n = 0; n < ITERATIONS; n++) { + /* Start index for first string within p1. */ align1 = random () & 31; + + /* Start index for second string within p2. */ if (random () & 1) align2 = random () & 31; else align2 = align1 + (random () & 24); - pos = random () & 511; - size = random () & 511; + + /* Compute larger offset into buffers. */ j = align1 > align2 ? align1 : align2; - if (pos + j >= 511) + + /* Position of difference between strings. */ + pos = random () & 511; + + /* Ensure pos within range for strings. */ + if (j + pos >= 511) pos = 510 - j - (random () & 7); + + /* Maximum size of operation. */ + size = random () & 511; + + /* Note: size does not need to be capped to the page boundary, as either + - size >= pos, so the null ('\0') at 'pos' will terminate strncmp, or + - size < pos, so 'size' will terminate strncmp. */ + + /* Actual length of 1st string. */ len1 = random () & 511; if (pos >= len1 && (random () & 1)) len1 = pos + (random () & 7); if (len1 + j >= 512) len1 = 511 - j - (random () & 7); + + /* Actual length of 2nd string. */ + /* Note: len2 >= len1. */ if (pos >= len1) len2 = len1; else len2 = len1 + (len1 != 511 - j ? random () % (511 - j - len1) : 0); + + /* Compute max length of strings, plus margin of dword. */ j = (pos > len2 ? pos : len2) + align1 + 64; if (j > 512) j = 512; + + /* Fill p1 with random data. */ for (i = 0; i < j; ++i) { p1[i] = random () & 255; @@ -307,6 +332,8 @@ do_random_tests (void) p1[i] = 1 + (random () & 127); } } + + /* Fill p2 with random data. */ for (i = 0; i < j; ++i) { p2[i] = random () & 255; @@ -319,11 +346,15 @@ do_random_tests (void) } result = 0; + + /* Make strings the same, up to position pos. */ MEMCPY (p2 + align2, p1 + align1, pos); + if (pos < len1) { if (p2[align2 + pos] == p1[align1 + pos]) { + /* Insert difference. */ p2[align2 + pos] = random () & 255; if (p2[align2 + pos] == p1[align1 + pos]) p2[align2 + pos] = p1[align1 + pos] + 3 + (random () & 127); @@ -331,12 +362,15 @@ do_random_tests (void) if (pos < size) { + /* Set expectations. */ if (p1[align1 + pos] < p2[align2 + pos]) result = -1; else result = 1; } } + + /* Null terminate strings. */ p1[len1 + align1] = 0; p2[len2 + align2] = 0;