From: SADAHIRO Tomoyuki Date: Sun, 16 Apr 2006 18:45:37 +0000 (+0900) Subject: Re: [PATCH] update to pp_complement() via Coverity X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=74d49cd0c6fe69554c001c4efb03d89706f99ff5;p=p5sagit%2Fp5-mst-13.2.git Re: [PATCH] update to pp_complement() via Coverity Message-Id: <20060416184044.4ADB.BQW10602@nifty.com> Date: Sun, 16 Apr 2006 18:45:37 +0900 Subject: Re: [PATCH] update to pp_complement() via Coverity From: SADAHIRO Tomoyuki Message-Id: <20060417230614.20A5.BQW10602@nifty.com> Date: Mon, 17 Apr 2006 23:06:21 +0900 p4raw-id: //depot/perl@27871 --- diff --git a/pp.c b/pp.c index 8914545..7a70e15 100644 --- a/pp.c +++ b/pp.c @@ -2433,10 +2433,12 @@ PP(pp_complement) UV nchar = 0; UV nwide = 0; U8 * const send = tmps + len; + U8 * const origtmps = tmps; + const UV utf8flags = UTF8_ALLOW_ANYUV; while (tmps < send) { - const UV c = utf8n_to_uvchr(tmps, send-tmps, &l, UTF8_ALLOW_ANYUV); - tmps += UTF8SKIP(tmps); + const UV c = utf8n_to_uvchr(tmps, send-tmps, &l, utf8flags); + tmps += l; targlen += UNISKIP(~c); nchar++; if (c > 0xff) @@ -2444,17 +2446,17 @@ PP(pp_complement) } /* Now rewind strings and write them. */ - tmps -= len; + tmps = origtmps; if (nwide) { U8 *result; U8 *p; - Newxz(result, targlen + 1, U8); + Newx(result, targlen + 1, U8); p = result; while (tmps < send) { - const UV c = utf8n_to_uvchr(tmps, send-tmps, &l, UTF8_ALLOW_ANYUV); - tmps += UTF8SKIP(tmps); + const UV c = utf8n_to_uvchr(tmps, send-tmps, &l, utf8flags); + tmps += l; p = uvchr_to_utf8_flags(p, ~c, UNICODE_ALLOW_ANY); } *p = '\0'; @@ -2466,11 +2468,11 @@ PP(pp_complement) U8 *result; U8 *p; - Newxz(result, nchar + 1, U8); + Newx(result, nchar + 1, U8); p = result; while (tmps < send) { - const U8 c = (U8)utf8n_to_uvchr(tmps, 0, &l, UTF8_ALLOW_ANY); - tmps += UTF8SKIP(tmps); + const U8 c = (U8)utf8n_to_uvchr(tmps, send-tmps, &l, utf8flags); + tmps += l; *p++ = ~c; } *p = '\0'; diff --git a/t/op/bop.t b/t/op/bop.t index 28ac60e..7e8a0c7 100755 --- a/t/op/bop.t +++ b/t/op/bop.t @@ -15,7 +15,7 @@ BEGIN { # If you find tests are failing, please try adding names to tests to track # down where the failure is, and supply your new names as a patch. # (Just-in-time test naming) -plan tests => 160; +plan tests => 161; # numerics ok ((0xdead & 0xbeef) == 0x9ead); @@ -412,3 +412,19 @@ SKIP: { is($b, chr(0x1FE) x 0x0FF . chr(0x101) x 2); } +# update to pp_complement() via Coverity +SKIP: { + # UTF-EBCDIC is limited to 0x7fffffff and can't encode ~0. + skip "EBCDIC" if $Is_EBCDIC; + + my $str = "\x{10000}\x{800}"; + # U+10000 is four bytes in UTF-8/UTF-EBCDIC. + # U+0800 is three bytes in UTF-8/UTF-EBCDIC. + + no warnings "utf8"; + { use bytes; $str =~ s/\C\C\z//; } + + # it's really bogus that (~~malformed) is \0. + my $ref = "\x{10000}\0"; + is(~~$str, $ref); +}