Skip to content

Commit 181355e

Browse files
committed
Consistent return and notices for substr type of functions
1 parent 236ddc5 commit 181355e

24 files changed

+1077
-11955
lines changed

ext/iconv/iconv.c

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -643,23 +643,38 @@ static php_iconv_err_t _php_iconv_substr(smart_str *pretval,
643643
}
644644

645645
if (len < 0) {
646-
if ((len += (total_len - offset)) < 0) {
647-
return PHP_ICONV_ERR_SUCCESS;
646+
len += (total_len - offset);
647+
if (len < 0) {
648+
/* Argument 2 is offsetn and argument 1 is source string */
649+
php_error_docref(NULL, E_NOTICE, "Argument #2 ($%s) is not contained in argument #1 ($%s)",
650+
get_active_function_arg_name(2), get_active_function_arg_name(1));
651+
len = 0;
648652
}
649653
}
650654

651655
if (offset < 0) {
652-
if ((offset += total_len) < 0) {
653-
return PHP_ICONV_ERR_SUCCESS;
656+
offset += total_len;
657+
if (offset < 0) {
658+
/* Argument 2 is offsetn and argument 1 is source string */
659+
php_error_docref(NULL, E_NOTICE, "Argument #2 ($%s) is not contained in argument #1 ($%s)",
660+
get_active_function_arg_name(2), get_active_function_arg_name(1));
661+
offset = 0;
654662
}
655663
}
656664

657665
if((size_t)len > total_len) {
666+
// TODO Emit notice/ValueError
658667
len = total_len;
659668
}
660669

661670

662671
if ((size_t)offset > total_len) {
672+
/* Argument 2 is offsetn and argument 1 is source string */
673+
php_error_docref(NULL, E_NOTICE, "Argument #2 ($%s) is not contained in argument #1 ($%s)",
674+
get_active_function_arg_name(2), get_active_function_arg_name(1));
675+
/* Return an empty string */
676+
smart_str_appendl(pretval, "", 0);
677+
smart_str_0(pretval);
663678
return PHP_ICONV_ERR_SUCCESS;
664679
}
665680

ext/iconv/tests/iconv_substr.phpt

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,17 @@ bar("This is a test", 0, -100000);
4040
bar("This is a test", -9, -100000);
4141
var_dump(iconv("ISO-2022-JP", "EUC-JP", iconv_substr(iconv("EUC-JP", "ISO-2022-JP", "こんにちは ISO-2022-JP"), 3, 8, "ISO-2022-JP")));
4242
?>
43-
--EXPECT--
43+
--EXPECTF--
4444
666768696a6b6c
4545
666768696a6b6c
4646
a6a4a8a4aaa4ab
4747
a4aba4ada4afa4b1a4b3a4b5a4b7
48-
bool(false)
49-
bool(false)
48+
49+
Notice: substr(): Argument #2 ($start) is not contained in argument #1 ($str) in %s on line %d
50+
string(0) ""
51+
52+
Notice: iconv_substr(): Argument #2 ($offset) is not contained in argument #1 ($str) in %s on line %d
53+
string(0) ""
5054
string(14) "This is a test"
5155
string(14) "This is a test"
5256
string(3) "est"
@@ -56,7 +60,11 @@ string(3) "est"
5660
string(5) "This "
5761
string(5) "This "
5862
bool(false)
63+
64+
Notice: iconv_substr(): Argument #2 ($offset) is not contained in argument #1 ($str) in %s on line %d
65+
string(0) ""
5966
bool(false)
60-
bool(false)
61-
bool(false)
67+
68+
Notice: iconv_substr(): Argument #2 ($offset) is not contained in argument #1 ($str) in %s on line %d
69+
string(0) ""
6270
string(10) "ちは ISO-2"

ext/mbstring/mbstring.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2244,6 +2244,8 @@ PHP_FUNCTION(mb_substr)
22442244
} else if (-from < mblen) {
22452245
real_from = mblen + from;
22462246
} else {
2247+
php_error_docref(NULL, E_NOTICE, "Argument #2 ($%s) is not contained in argument #1 ($%s)",
2248+
get_active_function_arg_name(2), get_active_function_arg_name(1));
22472249
real_from = 0;
22482250
}
22492251

@@ -2257,6 +2259,7 @@ PHP_FUNCTION(mb_substr)
22572259
} else if (real_from < mblen && -len < mblen - real_from) {
22582260
real_len = (mblen - real_from) + len;
22592261
} else {
2262+
// TODO Emit notice?
22602263
real_len = 0;
22612264
}
22622265

@@ -2296,6 +2299,8 @@ PHP_FUNCTION(mb_strcut)
22962299
if (from < 0) {
22972300
from = string.len + from;
22982301
if (from < 0) {
2302+
php_error_docref(NULL, E_NOTICE, "Argument #2 ($%s) is not contained in argument #1 ($%s)",
2303+
get_active_function_arg_name(2), get_active_function_arg_name(1));
22992304
from = 0;
23002305
}
23012306
}
@@ -2311,8 +2316,9 @@ PHP_FUNCTION(mb_strcut)
23112316
}
23122317

23132318
if (from > string.len) {
2314-
// TODO Out of bounds ValueError
2315-
RETURN_FALSE;
2319+
php_error_docref(NULL, E_NOTICE, "Argument #2 ($%s) is not contained in argument #1 ($%s)",
2320+
get_active_function_arg_name(2), get_active_function_arg_name(1));
2321+
RETURN_EMPTY_STRING();
23162322
}
23172323

23182324
ret = mbfl_strcut(&string, &result, from, len);

ext/mbstring/tests/bug49354.phpt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,12 @@ var_dump(mb_strcut($crap, 3, 100, 'UTF-8'));
1212
var_dump(mb_strcut($crap, 12, 100, 'UTF-8'));
1313
var_dump(mb_strcut($crap, 13, 100, 'UTF-8'));
1414
?>
15-
--EXPECT--
15+
--EXPECTF--
1616
string(12) "AåBäCöDü"
1717
string(11) "åBäCöDü"
1818
string(11) "åBäCöDü"
1919
string(9) "BäCöDü"
2020
string(0) ""
21-
bool(false)
21+
22+
Notice: mb_strcut(): Argument #2 ($start) is not contained in argument #1 ($str) in %s on line %d
23+
string(0) ""

ext/mbstring/tests/mb_strcut.phpt

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,19 @@ $euc_jp = '0123
1616
print mb_strcut($euc_jp, 6, 5,'EUC-JP') . "\n";
1717
print mb_strcut($euc_jp, 0, 100,'EUC-JP') . "\n";
1818

19-
$str = mb_strcut($euc_jp, 100, 10,'EUC-JP');
20-
($str === false) ? print "OK\n" : print "NG: $str\n";
19+
var_dump(mb_strcut($euc_jp, 100, 10,'EUC-JP'));
2120

2221
$str = mb_strcut($euc_jp, -100, 10,'EUC-JP');
2322
($str !== "") ? print "OK: $str\n" : print "NG:\n";
2423

2524

2625
?>
27-
--EXPECT--
26+
--EXPECTF--
2827
の文
2928
0123この文字列は日本語です。EUC-JPを使っています。日本語は面倒臭い。
30-
OK
29+
30+
Notice: mb_strcut(): Argument #2 ($start) is not contained in argument #1 ($str) in %s on line %d
31+
string(0) ""
32+
33+
Notice: mb_strcut(): Argument #2 ($start) is not contained in argument #1 ($str) in %s on line %d
3134
OK: 0123この文

ext/mbstring/tests/mb_substr.phpt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,10 @@ $str = mb_substr($euc_jp, -100, 10,'EUC-JP');
2424
($str !== "") ? print "4 OK: ".bin2hex($str)."\n" : print "NG: ".bin2hex($str)."\n";
2525

2626
?>
27-
--EXPECT--
27+
--EXPECTF--
2828
1: c6fccbdcb8eca4c7a4b9a1a34555432d
2929
2: 30313233a4b3a4cecab8bbfacef3a4cfc6fccbdcb8eca4c7a4b9a1a34555432d4a50a4f2bbc8a4c3a4c6a4a4a4dea4b9a1a3c6fccbdcb8eca4cfccccc5ddbdada4a4a1a3
3030
3 OK
31+
32+
Notice: mb_substr(): Argument #2 ($start) is not contained in argument #1 ($str) in %s on line %d
3133
4 OK: 30313233a4b3a4cecab8bbfacef3a4cf

ext/mbstring/tests/mb_substr_variation4.phpt

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,31 +44,47 @@ for ($i = -60; $i <= 60; $i += 10) {
4444

4545
echo "Done";
4646
?>
47-
--EXPECT--
47+
--EXPECTF--
4848
*** Testing mb_substr() : usage variations ***
4949

5050
**-- Offset is: -60 --**
5151
-- ASCII String --
52+
53+
Notice: mb_substr(): Argument #2 ($start) is not contained in argument #1 ($str) in %s on line %d
5254
string(8) "K0lzIA=="
5355
--Multibyte String --
56+
57+
Notice: mb_substr(): Argument #2 ($start) is not contained in argument #1 ($str) in %s on line %d
5458
string(16) "5pel5pys6Kqe44OG"
5559

5660
**-- Offset is: -50 --**
5761
-- ASCII String --
62+
63+
Notice: mb_substr(): Argument #2 ($start) is not contained in argument #1 ($str) in %s on line %d
5864
string(8) "K0lzIA=="
5965
--Multibyte String --
66+
67+
Notice: mb_substr(): Argument #2 ($start) is not contained in argument #1 ($str) in %s on line %d
6068
string(16) "5pel5pys6Kqe44OG"
6169

6270
**-- Offset is: -40 --**
6371
-- ASCII String --
72+
73+
Notice: mb_substr(): Argument #2 ($start) is not contained in argument #1 ($str) in %s on line %d
6474
string(8) "K0lzIA=="
6575
--Multibyte String --
76+
77+
Notice: mb_substr(): Argument #2 ($start) is not contained in argument #1 ($str) in %s on line %d
6678
string(16) "5pel5pys6Kqe44OG"
6779

6880
**-- Offset is: -30 --**
6981
-- ASCII String --
82+
83+
Notice: mb_substr(): Argument #2 ($start) is not contained in argument #1 ($str) in %s on line %d
7084
string(8) "K0lzIA=="
7185
--Multibyte String --
86+
87+
Notice: mb_substr(): Argument #2 ($start) is not contained in argument #1 ($str) in %s on line %d
7288
string(16) "5pel5pys6Kqe44OG"
7389

7490
**-- Offset is: -20 --**

ext/mbstring/tests/mb_substr_variation6.phpt

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,31 +49,47 @@ for ($i = -60; $i <= 60; $i += 10) {
4949

5050
echo "Done";
5151
?>
52-
--EXPECT--
52+
--EXPECTF--
5353
*** Testing mb_substr() : usage variations ***
5454

5555
**-- Offset is: -60 --**
5656
-- ASCII String --
57+
58+
Notice: mb_substr(): Argument #2 ($start) is not contained in argument #1 ($str) in %s on line %d
5759
string(8) "2b497320"
5860
--Multibyte String --
61+
62+
Notice: mb_substr(): Argument #2 ($start) is not contained in argument #1 ($str) in %s on line %d
5963
string(24) "e697a5e69cace8aa9ee38386"
6064

6165
**-- Offset is: -50 --**
6266
-- ASCII String --
67+
68+
Notice: mb_substr(): Argument #2 ($start) is not contained in argument #1 ($str) in %s on line %d
6369
string(8) "2b497320"
6470
--Multibyte String --
71+
72+
Notice: mb_substr(): Argument #2 ($start) is not contained in argument #1 ($str) in %s on line %d
6573
string(24) "e697a5e69cace8aa9ee38386"
6674

6775
**-- Offset is: -40 --**
6876
-- ASCII String --
77+
78+
Notice: mb_substr(): Argument #2 ($start) is not contained in argument #1 ($str) in %s on line %d
6979
string(8) "2b497320"
7080
--Multibyte String --
81+
82+
Notice: mb_substr(): Argument #2 ($start) is not contained in argument #1 ($str) in %s on line %d
7183
string(24) "e697a5e69cace8aa9ee38386"
7284

7385
**-- Offset is: -30 --**
7486
-- ASCII String --
87+
88+
Notice: mb_substr(): Argument #2 ($start) is not contained in argument #1 ($str) in %s on line %d
7589
string(8) "2b497320"
7690
--Multibyte String --
91+
92+
Notice: mb_substr(): Argument #2 ($start) is not contained in argument #1 ($str) in %s on line %d
7793
string(24) "e697a5e69cace8aa9ee38386"
7894

7995
**-- Offset is: -20 --**

ext/opcache/Optimizer/sccp.c

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -968,12 +968,6 @@ static inline int ct_eval_func_call(
968968
return FAILURE;
969969
}
970970
/* pass */
971-
} else if (zend_string_equals_literal(name, "substr")) {
972-
if (Z_TYPE_P(args[0]) != IS_STRING
973-
|| Z_TYPE_P(args[1]) != IS_LONG) {
974-
return FAILURE;
975-
}
976-
/* pass */
977971
} else if (zend_string_equals_literal(name, "pow")) {
978972
if ((Z_TYPE_P(args[0]) != IS_LONG && Z_TYPE_P(args[0]) != IS_DOUBLE)
979973
|| (Z_TYPE_P(args[1]) != IS_LONG && Z_TYPE_P(args[1]) != IS_DOUBLE)) {

0 commit comments

Comments
 (0)