| 
        php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login | 
  [2003-01-09 07:59 UTC] pascal dot terjan at free dot fr
 This quite heavily recursive script produces a segmentation fault :
 
<?php
$depls=Array(
			'G'=>Array(-1, 0),
			'D'=>Array(1, 0),
			'B'=>Array(0, 1),
			'H'=>Array(0, -1));			
$pieces=Array(
			  Array(Array(0,0),
					Array(0,1)),
			  Array(Array(0,0),
					Array(0,1)),
			  Array(Array(0,0),
					Array(0,1)),
			  Array(Array(0,0),
					Array(0,1)),
			  Array(Array(0,0),
					Array(0,1),
					Array(1,0),
					Array(1,1)),
			  Array(Array(0,0)),
			  Array(Array(0,0)),
			  Array(Array(0,0)),
			  Array(Array(0,0)),
			  Array(Array(0,0),
					Array(1,0)));
$init=Array(
			Array(0,0),
			Array(3,0),
			Array(1,3),
			Array(2,3),
			Array(1,0),
			Array(0,3),
			Array(0,4),
			Array(3,3),
			Array(3,4),
			Array(1,2));
function is_final($situation){
  return(($situation[4][0]==1)&&($situation[4][1]==3));
}
function occupable($situation, $x, $y){
  global $pieces;
  if($x>3) return false;
  if($y>4) return false;
  if($x<0) return false;
  if($y<0) return false;
  foreach($situation as $piece=>$pos){
	if($pos=="") continue;
	$p = $pieces[$piece];
	foreach($p as $case){
	  if(($case[0]+$pos[0]==$x)&&
		 ($case[1]+$pos[1]==$y)) return false;
	}
  }
  return true;
}
function valide($situation, $piece, $mov){
  global $pieces;
  $p = $pieces[$piece];
  $x = $situation[$piece][0];
  $y = $situation[$piece][1];
  $situation[$piece]="";
  foreach($p as $case){
	if(!occupable($situation, $x+$case[0]+$mov[0], $y+$case[1]+$mov[1]))
	  return false;
  }
  return true;
}
function resolv($situation){
  global $tab, $depls, $pieces, $solution;
  $d = $depls;
  $p = $pieces;
  if(is_final($situation)){
	$solution = "";
	return;
  }
  foreach($p as $num=>$piece){
	foreach($d as $nom=>$mov){
	  if(valide($situation, $num, $mov)){
		$situation2=serialize($situation);
		$s3=$situation;
		$situation[$num][0]+=$mov[0];
		$situation[$num][1]+=$mov[1];
		$s=serialize($situation);
	   	if(isset($tab[$s])){
		  $situation = $s3;
		  continue;
		}
		$tab[$s]="";
		//echo $num.' '.$nom."\n";
		//print_r($situation);
		$tab[$situation2][$s]=Array($num=>$nom);
		resolv($situation);
		if($tab[$s]=="") unset($tab[$s]);
		if(isset($solution)){
		  $solution=$num.' '.$nom."\n".$solution;
		  return;
		}
		$situation = $s3;
	  }
	}
  }
}
resolv($init);
print_r($tab);
if(isset($solution)) echo $solution;
?>
(gdb) bt
#0  0x400ed1ee in _erealloc () from /usr/lib/libphp_common.so.430
(gdb) 
I tryied it with an older PHP and also got a segfault but somewhere else.
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits             
             | 
    |||||||||||||||||||||||||||||||||||||
            
                 
                Copyright © 2001-2025 The PHP GroupAll rights reserved.  | 
        Last updated: Tue Nov 04 12:00:01 2025 UTC | 
Perphaps you have a system limit on the amount of memory a process make try to use. Try the following script and see if it crashes: <?php $a = str_repeat('a', 25000000); ?>