2012-01-14 30 views
17

Tôi có đoạn code làm việc tiếp theo:Cảnh báo: preg_match(): pcre_fullinfo Internal()

$test = '123456'; 

$int = preg_match('/^\d+$/', $test, $matches); 

print_r(array($int, $matches)); 

Tuy nhiên khi tôi execute it on codepad tôi nhận được lỗi:

Warning: preg_match(): Internal pcre_fullinfo() error -3 on line 5

Nhưng mã đang chạy trên của tôi máy riêng (và mã nên được IMHO tốt).

Tôi cần phân phối mã của mình trong tương lai nên sẽ rất tệ nếu nó bị hỏng tùy thuộc vào một số cấu hình. Vì vậy, lý do codepad phá vỡ nó là gì?

Trả lời

29

Mã thực hiện qua codepad đang chạy trong một môi trường rất hạn chế:

Code execution is handled by a supervisor based on geordi. The strategy is to run everything under ptrace, with many system calls disallowed or ignored. Compilers and final executables are both executed in a chroot jail, with strict resource limits. The supervisor is written in Haskell.

Trong khi nó không có gì mà bạn mong đợi để phá vỡ một engine regex nó rất có thể là thư viện PCRE sử dụng một cái gì đó trong nội bộ bị chặn bởi các môi trường codepad. Không có hệ thống sản xuất nào sử dụng những hạn chế nghiêm trọng như vậy nên bạn nên an toàn khi sử dụng mã đó trong ứng dụng của mình.

Mã lỗi là viết tắt của "PCRE_ERROR_BADOPTION - giá trị của những gì không hợp lệ". Tuy nhiên, mã trong nguồn PHP xảy ra lỗi là rc = pcre_fullinfo(pce->re, extra, PCRE_INFO_CAPTURECOUNT, &num_subpats); sử dụng hằng số cho những gì. Vì vậy, nó rõ ràng có nghĩa là thư viện pcre bị hỏng trên codepad.

Nếu bạn muốn hoàn toàn an toàn, bạn có thể viết một chương trình C nhỏ bằng cách sử dụng libpcre để gọi hàm đó trên cùng một regex.