3v4l.org

run code in 300+ PHP versions simultaneously
<?php function is_serialized( $data, $strict = true ) { // if it isn't a string, it isn't serialized. if ( ! is_string( $data ) ) { return false; } $data = trim( $data ); if ( 'N;' == $data ) { return true; } if ( strlen( $data ) < 4 ) { return false; } if ( ':' !== $data[1] ) { return false; } if ( $strict ) { $lastc = substr( $data, -1 ); if ( ';' !== $lastc && '}' !== $lastc ) { return false; } } else { $semicolon = strpos( $data, ';' ); $brace = strpos( $data, '}' ); // Either ; or } must exist. if ( false === $semicolon && false === $brace ) return false; // But neither must be in the first X characters. if ( false !== $semicolon && $semicolon < 3 ) return false; if ( false !== $brace && $brace < 4 ) return false; } $token = $data[0]; switch ( $token ) { case 's' : if ( $strict ) { if ( '"' !== substr( $data, -2, 1 ) ) { return false; } } elseif ( false === strpos( $data, '"' ) ) { return false; } // or else fall through case 'a' : case 'O' : return (bool) preg_match( "/^{$token}:[0-9]+:/s", $data ); case 'b' : case 'i' : case 'd' : $end = $strict ? '$' : ''; return (bool) preg_match( "/^{$token}:[0-9.E-]+;$end/", $data ); } return false; } $str = 's:4:"test"xxx}'; if (is_serialized($str, false)) { echo 'fuck'; } else { echo 'haha'; } if (is_serialized($str)) { echo 'haha'; } else { echo 'fuck'; }
Finding entry points
Branch analysis from position: 0
2 jumps found. (Code = 43) Position 1 = 6, Position 2 = 8
Branch analysis from position: 6
1 jumps found. (Code = 42) Position 1 = 9
Branch analysis from position: 9
2 jumps found. (Code = 43) Position 1 = 13, Position 2 = 15
Branch analysis from position: 13
1 jumps found. (Code = 42) Position 1 = 16
Branch analysis from position: 16
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 15
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 8
2 jumps found. (Code = 43) Position 1 = 13, Position 2 = 15
Branch analysis from position: 13
Branch analysis from position: 15
filename:       /in/NJK5T
function name:  (null)
number of ops:  17
compiled vars:  !0 = $str
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   58     0  E >   ASSIGN                                                   !0, 's%3A4%3A%22test%22xxx%7D'
   60     1        INIT_FCALL                                               'is_serialized'
          2        SEND_VAR                                                 !0
          3        SEND_VAL                                                 <false>
          4        DO_FCALL                                      0  $2      
          5      > JMPZ                                                     $2, ->8
   61     6    >   ECHO                                                     'fuck'
          7      > JMP                                                      ->9
   63     8    >   ECHO                                                     'haha'
   66     9    >   INIT_FCALL                                               'is_serialized'
         10        SEND_VAR                                                 !0
         11        DO_FCALL                                      0  $3      
         12      > JMPZ                                                     $3, ->15
   67    13    >   ECHO                                                     'haha'
         14      > JMP                                                      ->16
   69    15    >   ECHO                                                     'fuck'
   70    16    > > RETURN                                                   1

Function is_serialized:
Finding entry points
Branch analysis from position: 0
2 jumps found. (Code = 43) Position 1 = 5, Position 2 = 6
Branch analysis from position: 5
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 6
2 jumps found. (Code = 43) Position 1 = 12, Position 2 = 13
Branch analysis from position: 12
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 13
2 jumps found. (Code = 43) Position 1 = 16, Position 2 = 17
Branch analysis from position: 16
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 17
2 jumps found. (Code = 43) Position 1 = 20, Position 2 = 21
Branch analysis from position: 20
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 21
2 jumps found. (Code = 43) Position 1 = 22, Position 2 = 34
Branch analysis from position: 22
2 jumps found. (Code = 46) Position 1 = 29, Position 2 = 31
Branch analysis from position: 29
2 jumps found. (Code = 43) Position 1 = 32, Position 2 = 33
Branch analysis from position: 32
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 33
1 jumps found. (Code = 42) Position 1 = 62
Branch analysis from position: 62
8 jumps found. (Code = 188) Position 1 = 78, Position 2 = 95, Position 3 = 95, Position 4 = 104, Position 5 = 104, Position 6 = 104, Position 7 = 120, Position 8 = 65
Branch analysis from position: 78
2 jumps found. (Code = 43) Position 1 = 79, Position 2 = 88
Branch analysis from position: 79
2 jumps found. (Code = 43) Position 1 = 86, Position 2 = 87
Branch analysis from position: 86
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 87
1 jumps found. (Code = 42) Position 1 = 95
Branch analysis from position: 95
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 88
2 jumps found. (Code = 43) Position 1 = 94, Position 2 = 95
Branch analysis from position: 94
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 95
Branch analysis from position: 95
Branch analysis from position: 95
Branch analysis from position: 104
2 jumps found. (Code = 43) Position 1 = 105, Position 2 = 107
Branch analysis from position: 105
1 jumps found. (Code = 42) Position 1 = 108
Branch analysis from position: 108
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 107
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 104
Branch analysis from position: 104
Branch analysis from position: 120
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 65
2 jumps found. (Code = 44) Position 1 = 67, Position 2 = 78
Branch analysis from position: 67
2 jumps found. (Code = 44) Position 1 = 69, Position 2 = 95
Branch analysis from position: 69
2 jumps found. (Code = 44) Position 1 = 71, Position 2 = 95
Branch analysis from position: 71
2 jumps found. (Code = 44) Position 1 = 73, Position 2 = 104
Branch analysis from position: 73
2 jumps found. (Code = 44) Position 1 = 75, Position 2 = 104
Branch analysis from position: 75
2 jumps found. (Code = 44) Position 1 = 77, Position 2 = 104
Branch analysis from position: 77
1 jumps found. (Code = 42) Position 1 = 120
Branch analysis from position: 120
Branch analysis from position: 104
Branch analysis from position: 104
Branch analysis from position: 104
Branch analysis from position: 95
Branch analysis from position: 95
Branch analysis from position: 78
Branch analysis from position: 31
Branch analysis from position: 34
2 jumps found. (Code = 46) Position 1 = 46, Position 2 = 48
Branch analysis from position: 46
2 jumps found. (Code = 43) Position 1 = 49, Position 2 = 50
Branch analysis from position: 49
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 50
2 jumps found. (Code = 46) Position 1 = 52, Position 2 = 54
Branch analysis from position: 52
2 jumps found. (Code = 43) Position 1 = 55, Position 2 = 56
Branch analysis from position: 55
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 56
2 jumps found. (Code = 46) Position 1 = 58, Position 2 = 60
Branch analysis from position: 58
2 jumps found. (Code = 43) Position 1 = 61, Position 2 = 62
Branch analysis from position: 61
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 62
Branch analysis from position: 60
Branch analysis from position: 54
Branch analysis from position: 48
filename:       /in/NJK5T
function name:  is_serialized
number of ops:  122
compiled vars:  !0 = $data, !1 = $strict, !2 = $lastc, !3 = $semicolon, !4 = $brace, !5 = $token, !6 = $end
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
    3     0  E >   RECV                                             !0      
          1        RECV_INIT                                        !1      <true>
    5     2        TYPE_CHECK                                   64  ~7      !0
          3        BOOL_NOT                                         ~8      ~7
          4      > JMPZ                                                     ~8, ->6
    6     5    > > RETURN                                                   <false>
    8     6    >   INIT_FCALL                                               'trim'
          7        SEND_VAR                                                 !0
          8        DO_ICALL                                         $9      
          9        ASSIGN                                                   !0, $9
    9    10        IS_EQUAL                                                 !0, 'N%3B'
         11      > JMPZ                                                     ~11, ->13
   10    12    > > RETURN                                                   <true>
   12    13    >   STRLEN                                           ~12     !0
         14        IS_SMALLER                                               ~12, 4
         15      > JMPZ                                                     ~13, ->17
   13    16    > > RETURN                                                   <false>
   15    17    >   FETCH_DIM_R                                      ~14     !0, 1
         18        IS_NOT_IDENTICAL                                         ~14, '%3A'
         19      > JMPZ                                                     ~15, ->21
   16    20    > > RETURN                                                   <false>
   18    21    > > JMPZ                                                     !1, ->34
   19    22    >   INIT_FCALL                                               'substr'
         23        SEND_VAR                                                 !0
         24        SEND_VAL                                                 -1
         25        DO_ICALL                                         $16     
         26        ASSIGN                                                   !2, $16
   20    27        IS_NOT_IDENTICAL                                 ~18     !2, '%3B'
         28      > JMPZ_EX                                          ~18     ~18, ->31
         29    >   IS_NOT_IDENTICAL                                 ~19     !2, '%7D'
         30        BOOL                                             ~18     ~19
         31    > > JMPZ                                                     ~18, ->33
   21    32    > > RETURN                                                   <false>
         33    > > JMP                                                      ->62
   24    34    >   INIT_FCALL                                               'strpos'
         35        SEND_VAR                                                 !0
         36        SEND_VAL                                                 '%3B'
         37        DO_ICALL                                         $20     
         38        ASSIGN                                                   !3, $20
   25    39        INIT_FCALL                                               'strpos'
         40        SEND_VAR                                                 !0
         41        SEND_VAL                                                 '%7D'
         42        DO_ICALL                                         $22     
         43        ASSIGN                                                   !4, $22
   27    44        TYPE_CHECK                                    4  ~24     !3
         45      > JMPZ_EX                                          ~24     ~24, ->48
         46    >   TYPE_CHECK                                    4  ~25     !4
         47        BOOL                                             ~24     ~25
         48    > > JMPZ                                                     ~24, ->50
   28    49    > > RETURN                                                   <false>
   30    50    >   TYPE_CHECK                                  1018  ~26     !3
         51      > JMPZ_EX                                          ~26     ~26, ->54
         52    >   IS_SMALLER                                       ~27     !3, 3
         53        BOOL                                             ~26     ~27
         54    > > JMPZ                                                     ~26, ->56
   31    55    > > RETURN                                                   <false>
   32    56    >   TYPE_CHECK                                  1018  ~28     !4
         57      > JMPZ_EX                                          ~28     ~28, ->60
         58    >   IS_SMALLER                                       ~29     !4, 4
         59        BOOL                                             ~28     ~29
         60    > > JMPZ                                                     ~28, ->62
   33    61    > > RETURN                                                   <false>
   35    62    >   FETCH_DIM_R                                      ~30     !0, 0
         63        ASSIGN                                                   !5, ~30
   36    64      > SWITCH_STRING                                            !5, [ 's':->78, 'a':->95, 'O':->95, 'b':->104, 'i':->104, 'd':->104, ], ->120
   37    65    >   IS_EQUAL                                                 !5, 's'
         66      > JMPNZ                                                    ~32, ->78
   46    67    >   IS_EQUAL                                                 !5, 'a'
         68      > JMPNZ                                                    ~32, ->95
   47    69    >   IS_EQUAL                                                 !5, 'O'
         70      > JMPNZ                                                    ~32, ->95
   49    71    >   IS_EQUAL                                                 !5, 'b'
         72      > JMPNZ                                                    ~32, ->104
   50    73    >   IS_EQUAL                                                 !5, 'i'
         74      > JMPNZ                                                    ~32, ->104
   51    75    >   IS_EQUAL                                                 !5, 'd'
         76      > JMPNZ                                                    ~32, ->104
         77    > > JMP                                                      ->120
   38    78    > > JMPZ                                                     !1, ->88
   39    79    >   INIT_FCALL                                               'substr'
         80        SEND_VAR                                                 !0
         81        SEND_VAL                                                 -2
         82        SEND_VAL                                                 1
         83        DO_ICALL                                         $33     
         84        IS_NOT_IDENTICAL                                         $33, '%22'
         85      > JMPZ                                                     ~34, ->87
   40    86    > > RETURN                                                   <false>
         87    > > JMP                                                      ->95
   42    88    >   INIT_FCALL                                               'strpos'
         89        SEND_VAR                                                 !0
         90        SEND_VAL                                                 '%22'
         91        DO_ICALL                                         $35     
         92        TYPE_CHECK                                    4          $35
         93      > JMPZ                                                     ~36, ->95
   43    94    > > RETURN                                                   <false>
   48    95    >   INIT_FCALL                                               'preg_match'
         96        ROPE_INIT                                     3  ~38     '%2F%5E'
         97        ROPE_ADD                                      1  ~38     ~38, !5
         98        ROPE_END                                      2  ~37     ~38, '%3A%5B0-9%5D%2B%3A%2Fs'
         99        SEND_VAL                                                 ~37
        100        SEND_VAR                                                 !0
        101        DO_ICALL                                         $40     
        102        BOOL                                             ~41     $40
        103      > RETURN                                                   ~41
   52   104    > > JMPZ                                                     !1, ->107
        105    >   QM_ASSIGN                                        ~42     '%24'
        106      > JMP                                                      ->108
        107    >   QM_ASSIGN                                        ~42     ''
        108    >   ASSIGN                                                   !6, ~42
   53   109        INIT_FCALL                                               'preg_match'
        110        ROPE_INIT                                     5  ~45     '%2F%5E'
        111        ROPE_ADD                                      1  ~45     ~45, !5
        112        ROPE_ADD                                      2  ~45     ~45, '%3A%5B0-9.E-%5D%2B%3B'
        113        ROPE_ADD                                      3  ~45     ~45, !6
        114        ROPE_END                                      4  ~44     ~45, '%2F'
        115        SEND_VAL                                                 ~44
        116        SEND_VAR                                                 !0
        117        DO_ICALL                                         $48     
        118        BOOL                                             ~49     $48
        119      > RETURN                                                   ~49
   55   120    > > RETURN                                                   <false>
   56   121*     > RETURN                                                   null

End of function is_serialized

Generated using Vulcan Logic Dumper, using php 8.0.0


preferences:
185.77 ms | 1414 KiB | 23 Q