Hi Tye,

While it's true that SvPV_nolen is safer for reading, SvPVX and SvPV_nolen are equally dangerous with regards to the write operation that TheDauthi wants to deploy. In both cases, it is absolutely necessary to...

  1. allocate space via newSV(STRLEN), SvGROW(SV*, STRLEN), etc.
  2. make the SV* "POK" via SvPOK_on(SV*), so that it knows it contains a string.

The SvPV_nolen macro first checks the SV's private SVf_POK flag to see whether it contains a string. If it does, then it returns the pointer to the string, via SvPVX(SV*). If it doesn't, it calls sv_2pv_flags, which spits out a Use of uninitialized value warning, upgrades the sv, and returns (char*)"". That's safe to read from, but if you try to write to it... kaboom.

Here's a demo app...

#!/usr/bin/perl use strict; use warnings; use Inline C => <<'END_C'; void POKe() { SV *good_sv, *bad_sv; char *good_ptr, *bad_ptr; good_sv = newSV(83); bad_sv = newSV(83); SvPOK_on(good_sv); /* !!!! */ good_ptr = SvPV_nolen(good_sv); Copy("Joy!", good_ptr, 4, char); SvCUR_set(good_sv, 4); fprintf(stderr, "%s\n", SvPVX(good_sv)); bad_ptr = SvPV_nolen(bad_sv); fprintf(stderr, "wait for it...\n"); Copy("DEATH!", bad_ptr, 6, char); fprintf(stderr, "in heaven, everything is fine..."); } END_C POKe();

... and here's the output on my system...

slothbear:~/perltest marvin$ perl sv_poke.plx Joy! Use of uninitialized value in subroutine entry at sv_poke.plx line 33. wait for it... Bus error slothbear:~/perltest marvin$
--
Marvin Humphrey
Rectangular Research ― http://www.rectangular.com

In reply to Re^4: XS efficient copy (SvCUR_set) by creamygoodness
in thread XS efficient copy by TheDauthi

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.