Skip to content

Commit 397e27b

Browse files
committed
Consistent return and notices for substr type of functions
1 parent 34c460f commit 397e27b

24 files changed

+1078
-12002
lines changed

ext/iconv/iconv.c

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

648648
if (len < 0) {
649-
if ((len += (total_len - offset)) < 0) {
650-
return PHP_ICONV_ERR_SUCCESS;
649+
len += (total_len - offset);
650+
if (len < 0) {
651+
/* Argument 2 is offsetn and argument 1 is source string */
652+
php_error_docref(NULL, E_NOTICE, "Argument #2 ($%s) is not contained in argument #1 ($%s)",
653+
get_active_function_arg_name(2), get_active_function_arg_name(1));
654+
len = 0;
651655
}
652656
}
653657

654658
if (offset < 0) {
655-
if ((offset += total_len) < 0) {
656-
return PHP_ICONV_ERR_SUCCESS;
659+
offset += total_len;
660+
if (offset < 0) {
661+
/* Argument 2 is offsetn and argument 1 is source string */
662+
php_error_docref(NULL, E_NOTICE, "Argument #2 ($%s) is not contained in argument #1 ($%s)",
663+
get_active_function_arg_name(2), get_active_function_arg_name(1));
664+
offset = 0;
657665
}
658666
}
659667

660668
if((size_t)len > total_len) {
669+
// TODO Emit notice/ValueError
661670
len = total_len;
662671
}
663672

664673

665674
if ((size_t)offset > total_len) {
675+
/* Argument 2 is offsetn and argument 1 is source string */
676+
php_error_docref(NULL, E_NOTICE, "Argument #2 ($%s) is not contained in argument #1 ($%s)",
677+
get_active_function_arg_name(2), get_active_function_arg_name(1));
678+
/* Return an empty string */
679+
smart_str_appendl(pretval, "", 0);
680+
smart_str_0(pretval);
666681
return PHP_ICONV_ERR_SUCCESS;
667682
}
668683

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
@@ -2276,6 +2276,8 @@ PHP_FUNCTION(mb_substr)
22762276
} else if (-from < mblen) {
22772277
real_from = mblen + from;
22782278
} else {
2279+
php_error_docref(NULL, E_NOTICE, "Argument #2 ($%s) is not contained in argument #1 ($%s)",
2280+
get_active_function_arg_name(2), get_active_function_arg_name(1));
22792281
real_from = 0;
22802282
}
22812283

@@ -2289,6 +2291,7 @@ PHP_FUNCTION(mb_substr)
22892291
} else if (real_from < mblen && -len < mblen - real_from) {
22902292
real_len = (mblen - real_from) + len;
22912293
} else {
2294+
// TODO Emit notice?
22922295
real_len = 0;
22932296
}
22942297

@@ -2330,6 +2333,8 @@ PHP_FUNCTION(mb_strcut)
23302333
if (from < 0) {
23312334
from = string.len + from;
23322335
if (from < 0) {
2336+
php_error_docref(NULL, E_NOTICE, "Argument #2 ($%s) is not contained in argument #1 ($%s)",
2337+
get_active_function_arg_name(2), get_active_function_arg_name(1));
23332338
from = 0;
23342339
}
23352340
}
@@ -2345,8 +2350,9 @@ PHP_FUNCTION(mb_strcut)
23452350
}
23462351

23472352
if (from > string.len) {
2348-
// TODO Out of bounds ValueError
2349-
RETURN_FALSE;
2353+
php_error_docref(NULL, E_NOTICE, "Argument #2 ($%s) is not contained in argument #1 ($%s)",
2354+
get_active_function_arg_name(2), get_active_function_arg_name(1));
2355+
RETURN_EMPTY_STRING();
23502356
}
23512357

23522358
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
@@ -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) "K0lzIA=="
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(16) "5pel5pys6Kqe44OG"
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) "K0lzIA=="
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(16) "5pel5pys6Kqe44OG"
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) "K0lzIA=="
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(16) "5pel5pys6Kqe44OG"
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) "K0lzIA=="
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(16) "5pel5pys6Kqe44OG"
7894

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

ext/mbstring/tests/mb_substr_variation6.phpt

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

5555
echo "Done";
5656
?>
57-
--EXPECT--
57+
--EXPECTF--
5858
*** Testing mb_substr() : usage variations ***
5959

6060
**-- Offset is: -60 --**
6161
-- ASCII String --
62+
63+
Notice: mb_substr(): Argument #2 ($start) is not contained in argument #1 ($str) in %s on line %d
6264
string(8) "2b497320"
6365
--Multibyte String --
66+
67+
Notice: mb_substr(): Argument #2 ($start) is not contained in argument #1 ($str) in %s on line %d
6468
string(24) "e697a5e69cace8aa9ee38386"
6569

6670
**-- Offset is: -50 --**
6771
-- ASCII String --
72+
73+
Notice: mb_substr(): Argument #2 ($start) is not contained in argument #1 ($str) in %s on line %d
6874
string(8) "2b497320"
6975
--Multibyte String --
76+
77+
Notice: mb_substr(): Argument #2 ($start) is not contained in argument #1 ($str) in %s on line %d
7078
string(24) "e697a5e69cace8aa9ee38386"
7179

7280
**-- Offset is: -40 --**
7381
-- ASCII String --
82+
83+
Notice: mb_substr(): Argument #2 ($start) is not contained in argument #1 ($str) in %s on line %d
7484
string(8) "2b497320"
7585
--Multibyte String --
86+
87+
Notice: mb_substr(): Argument #2 ($start) is not contained in argument #1 ($str) in %s on line %d
7688
string(24) "e697a5e69cace8aa9ee38386"
7789

7890
**-- Offset is: -30 --**
7991
-- ASCII String --
92+
93+
Notice: mb_substr(): Argument #2 ($start) is not contained in argument #1 ($str) in %s on line %d
8094
string(8) "2b497320"
8195
--Multibyte String --
96+
97+
Notice: mb_substr(): Argument #2 ($start) is not contained in argument #1 ($str) in %s on line %d
8298
string(24) "e697a5e69cace8aa9ee38386"
8399

84100
**-- Offset is: -20 --**

ext/opcache/Optimizer/sccp.c

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -961,12 +961,6 @@ static inline int ct_eval_func_call(
961961
return FAILURE;
962962
}
963963
/* pass */
964-
} else if (zend_string_equals_literal(name, "substr")) {
965-
if (Z_TYPE_P(args[0]) != IS_STRING
966-
|| Z_TYPE_P(args[1]) != IS_LONG) {
967-
return FAILURE;
968-
}
969-
/* pass */
970964
} else if (zend_string_equals_literal(name, "pow")) {
971965
if ((Z_TYPE_P(args[0]) != IS_LONG && Z_TYPE_P(args[0]) != IS_DOUBLE)
972966
|| (Z_TYPE_P(args[1]) != IS_LONG && Z_TYPE_P(args[1]) != IS_DOUBLE)) {

0 commit comments

Comments
 (0)