summaryrefslogtreecommitdiff
path: root/doop.c
diff options
context:
space:
mode:
authorNicholas Clark <nick@ccl4.org>2008-02-12 13:15:20 +0000
committerNicholas Clark <nick@ccl4.org>2008-02-12 13:15:20 +0000
commit7918f24d20384771923d344a382e1d16d9552018 (patch)
tree627e24f3c520f70ddfd3fc9779420bd72fd00c55 /doop.c
parent9f10164a6c9d93684fedbbc188fb9dfe004c22c4 (diff)
downloadperl-7918f24d20384771923d344a382e1d16d9552018.tar.gz
assert() that every NN argument is not NULL. Otherwise we have the
ability to create landmines that will explode under someone in the future when they upgrade their compiler to one with better optimisation. We've already done this at least twice. (Yes, some of the assertions are after code that would already have SEGVd because it already deferences a pointer, but they are put in to make it easier to automate checking that each and every case is covered.) Add a tool, checkARGS_ASSERT.pl, to check that every case is covered. p4raw-id: //depot/perl@33291
Diffstat (limited to 'doop.c')
-rw-r--r--doop.c37
1 files changed, 31 insertions, 6 deletions
diff --git a/doop.c b/doop.c
index 59aa8075a4..1a5c829a6f 100644
--- a/doop.c
+++ b/doop.c
@@ -33,8 +33,10 @@ S_do_trans_simple(pTHX_ SV * const sv)
STRLEN len;
U8 *s = (U8*)SvPV(sv,len);
U8 * const send = s+len;
-
const short * const tbl = (short*)cPVOP->op_pv;
+
+ PERL_ARGS_ASSERT_DO_TRANS_SIMPLE;
+
if (!tbl)
Perl_croak(aTHX_ "panic: do_trans_simple line %d",__LINE__);
@@ -100,8 +102,10 @@ S_do_trans_count(pTHX_ SV * const sv)
const U8 *s = (const U8*)SvPV_const(sv, len);
const U8 * const send = s + len;
I32 matches = 0;
-
const short * const tbl = (short*)cPVOP->op_pv;
+
+ PERL_ARGS_ASSERT_DO_TRANS_COUNT;
+
if (!tbl)
Perl_croak(aTHX_ "panic: do_trans_count line %d",__LINE__);
@@ -136,8 +140,10 @@ S_do_trans_complex(pTHX_ SV * const sv)
U8 *s = (U8*)SvPV(sv, len);
U8 * const send = s+len;
I32 matches = 0;
-
const short * const tbl = (short*)cPVOP->op_pv;
+
+ PERL_ARGS_ASSERT_DO_TRANS_COMPLEX;
+
if (!tbl)
Perl_croak(aTHX_ "panic: do_trans_complex line %d",__LINE__);
@@ -306,7 +312,6 @@ S_do_trans_simple_utf8(pTHX_ SV * const sv)
I32 matches = 0;
const I32 grows = PL_op->op_private & OPpTRANS_GROWS;
STRLEN len;
-
SV* const rv =
#ifdef USE_ITHREADS
PAD_SVl(cPADOP->op_padix);
@@ -320,6 +325,8 @@ S_do_trans_simple_utf8(pTHX_ SV * const sv)
UV final = 0;
U8 hibit = 0;
+ PERL_ARGS_ASSERT_DO_TRANS_SIMPLE_UTF8;
+
s = (U8*)SvPV(sv, len);
if (!SvUTF8(sv)) {
const U8 *t = s;
@@ -407,7 +414,6 @@ S_do_trans_count_utf8(pTHX_ SV * const sv)
const U8 *send;
I32 matches = 0;
STRLEN len;
-
SV* const rv =
#ifdef USE_ITHREADS
PAD_SVl(cPADOP->op_padix);
@@ -420,6 +426,8 @@ S_do_trans_count_utf8(pTHX_ SV * const sv)
const UV extra = none + 1;
U8 hibit = 0;
+ PERL_ARGS_ASSERT_DO_TRANS_COUNT_UTF8;
+
s = (const U8*)SvPV_const(sv, len);
if (!SvUTF8(sv)) {
const U8 *t = s;
@@ -472,8 +480,10 @@ S_do_trans_complex_utf8(pTHX_ SV * const sv)
STRLEN len;
U8 *dstart, *dend;
U8 hibit = 0;
-
U8 *s = (U8*)SvPV(sv, len);
+
+ PERL_ARGS_ASSERT_DO_TRANS_COMPLEX_UTF8;
+
if (!SvUTF8(sv)) {
const U8 *t = s;
const U8 * const e = s + len;
@@ -621,6 +631,8 @@ Perl_do_trans(pTHX_ SV *sv)
const I32 hasutf = (PL_op->op_private &
(OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF));
+ PERL_ARGS_ASSERT_DO_TRANS;
+
if (SvREADONLY(sv)) {
if (SvIsCOW(sv))
sv_force_normal_flags(sv, 0);
@@ -671,6 +683,8 @@ Perl_do_join(pTHX_ register SV *sv, SV *delim, register SV **mark, register SV *
register STRLEN len;
STRLEN delimlen;
+ PERL_ARGS_ASSERT_DO_JOIN;
+
(void) SvPV_const(delim, delimlen); /* stringify and get the delimlen */
/* SvCUR assumes it's SvPOK() and woe betide you if it's not. */
@@ -727,6 +741,8 @@ Perl_do_sprintf(pTHX_ SV *sv, I32 len, SV **sarg)
const char * const pat = SvPV_const(*sarg, patlen);
bool do_taint = FALSE;
+ PERL_ARGS_ASSERT_DO_SPRINTF;
+
SvUTF8_off(sv);
if (DO_UTF8(*sarg))
SvUTF8_on(sv);
@@ -745,6 +761,8 @@ Perl_do_vecget(pTHX_ SV *sv, I32 offset, I32 size)
const unsigned char *s = (const unsigned char *) SvPV_const(sv, srclen);
UV retnum = 0;
+ PERL_ARGS_ASSERT_DO_VECGET;
+
if (offset < 0)
return 0;
if (size < 1 || (size & (size-1))) /* size < 1 or not a power of two */
@@ -895,6 +913,8 @@ Perl_do_vecset(pTHX_ SV *sv)
STRLEN len;
SV * const targ = LvTARG(sv);
+ PERL_ARGS_ASSERT_DO_VECSET;
+
if (!targ)
return;
s = (unsigned char*)SvPV_force(targ, targlen);
@@ -974,6 +994,8 @@ Perl_do_chop(pTHX_ register SV *astr, register SV *sv)
STRLEN len;
char *s;
+ PERL_ARGS_ASSERT_DO_CHOP;
+
if (SvTYPE(sv) == SVt_PVAV) {
register I32 i;
AV* const av = (AV*)sv;
@@ -1053,6 +1075,8 @@ Perl_do_chomp(pTHX_ register SV *sv)
char *temp_buffer = NULL;
SV* svrecode = NULL;
+ PERL_ARGS_ASSERT_DO_CHOMP;
+
if (RsSNARF(PL_rs))
return 0;
if (RsRECORD(PL_rs))
@@ -1201,6 +1225,7 @@ Perl_do_vop(pTHX_ I32 optype, SV *sv, SV *left, SV *right)
bool right_utf;
STRLEN needlen = 0;
+ PERL_ARGS_ASSERT_DO_VOP;
if (sv != left || (optype != OP_BIT_AND && !SvOK(sv) && !SvGMAGICAL(sv)))
sv_setpvn(sv, "", 0); /* avoid undef warning on |= and ^= */