Always use `const char *` to refer to the return value from SvPV
Always use const char *
to refer to the return value from SvPV.
Yesterday I got a bug report from a user via Github about Text::Fuzzy.
The bug report described that in some cases, when the user searched
for an edit distance with Unicode strings, the user's input value,
$string
in the following, seemed to be being overwritten and
corrupted:
$tf->distance ($string);
I couldn't reproduce the user's bug using the script he supplied, but
just in case, I went through the code and tried to find anywhere that
a string might be being overwritten, by adding const
in front of
every char *
pointer which was used to store a Perl string.
This led me to this
line
where the value corresponding to $string
in the above is read using
SvPV
, and this
line
where the value pointed to is overwritten by the code. This is a
special case which only executes when the user matches a byte string
against a character string.
As a fix for the bug, I changed to using allocated memory after the
test for Unicode, and added a field allocated
to the tf->b
and set
it to true or false so that the allocated memory could be freed. In a later commit I also added a test that the bug was fixed.
However, it would have been better if I had never allocated the return
value from SvPV
into a char *
but always used a const char *
.
According to Ken Thompson,
Const only confuses library interfaces with the hope of catching some rare errors
(source) but I'm not sure I agree with him.
Leave a comment