From a1f64bda77d74026d663eca91b975a6ff869d9a3 Mon Sep 17 00:00:00 2001 From: Claude Sonnet 5 Date: Mon, 17 Aug 2026 19:32:03 +0000 Subject: Guard arithmetic on file/shell-output-derived values against non-numeric strings PHP 8 throws a fatal TypeError for arithmetic (+ - * /) on a non-numeric string ("Unsupported operand types"); PHP 7.4 only warned and treated it as 0. Several files perform arithmetic directly on values parsed from intermediate state files (nnode.txt, nrows.txt, structure_input*.txt) or from `dot -Tplain` output, with no is_numeric() check — safe as long as those files are well-formed, but a crash risk if a file is missing/empty/truncated or a `dot` output line doesn't parse as expected. Affected: runtime_check.php ($node, $nrows), remove_variables.php and create_tiers_gom_part1.php ($maxplist=$node-1), mat_structure.php (matrix cell multiplication), and the four network_layout_{evd,inv}[,_2].php files ($r_index=$node+N and the dot-output-derived $cell arithmetic in the _2 variants). Fix pattern: coalesce to 0 via `is_numeric($x) ? $x : 0` before the arithmetic, matching PHP 7.4's original fallback-to-0 behavior instead of crashing. Verified empirically against PHP 8.3.28 with runtime_check.php and mat_structure.php: previously, a missing/empty source file caused TypeError: Unsupported operand types: string - int (or string * int) after the fix, the same missing-file scenario produces only the pre-existing "undefined array key" warnings (same as PHP 7.4) and the function completes and returns a value instead of crashing. Reviewed by: Frederick M Muriithi --- sourcecodes/create_tiers_gom_part1.php | 2 +- sourcecodes/mat_structure.php | 3 ++- sourcecodes/network_layout_evd.php | 1 + sourcecodes/network_layout_evd_2.php | 11 +++++++---- sourcecodes/network_layout_inv.php | 1 + sourcecodes/network_layout_inv_2.php | 11 +++++++---- sourcecodes/remove_variables.php | 2 +- sourcecodes/runtime_check.php | 4 +++- 8 files changed, 23 insertions(+), 12 deletions(-) (limited to 'sourcecodes') diff --git a/sourcecodes/create_tiers_gom_part1.php b/sourcecodes/create_tiers_gom_part1.php index 6b90c015..f2234c28 100644 --- a/sourcecodes/create_tiers_gom_part1.php +++ b/sourcecodes/create_tiers_gom_part1.php @@ -64,7 +64,7 @@ if($structure_thr=="") $nf=$dir.$keyval."nnode.txt"; $node=trim(file_get_contents("$nf")); -$maxplist=$node-1; +$maxplist=(is_numeric($node) ? $node : 0)-1; //print default number of parents $pfile=$dir.$keyval."parent.txt"; diff --git a/sourcecodes/mat_structure.php b/sourcecodes/mat_structure.php index f4e80290..21d7e709 100644 --- a/sourcecodes/mat_structure.php +++ b/sourcecodes/mat_structure.php @@ -65,7 +65,8 @@ for($l=0;$l<=$i;$l++) for($k=0;$k<$i;$k++) { - $cell=$data_cell[$k]*$cell_val[$k]; + $cell_raw=$data_cell[$k] ?? 0; + $cell=(is_numeric($cell_raw) ? $cell_raw : 0)*$cell_val[$k]; fprintf($fp,"%s\t",$cell); } } diff --git a/sourcecodes/network_layout_evd.php b/sourcecodes/network_layout_evd.php index 32e1b7bf..b02d4ce5 100644 --- a/sourcecodes/network_layout_evd.php +++ b/sourcecodes/network_layout_evd.php @@ -58,6 +58,7 @@ $datamat=array(); $data_read=array(); $node=trim($str_arrmat[0]); +$node=is_numeric($node) ? $node : 0; $width=150; $height=150; diff --git a/sourcecodes/network_layout_evd_2.php b/sourcecodes/network_layout_evd_2.php index 7703daab..d6bfa495 100644 --- a/sourcecodes/network_layout_evd_2.php +++ b/sourcecodes/network_layout_evd_2.php @@ -102,6 +102,7 @@ $str_arrmat=array(); $str_arrmat=explode("\n",$matrix1); $node=trim($str_arrmat[1]); +$node=is_numeric($node) ? $node : 0; if($str_arrmat[2]=="" || $matrix1=="") { @@ -199,6 +200,7 @@ $str_arrmat_old=explode("\n",$matrix1_old); $datamat_old=array(); $data_read_old=array(); $node_old=trim($str_arrmat_old[0]); +$node_old=is_numeric($node_old) ? $node_old : 0; $r_index_old=$node_old+2; for($i=0;$i<$node_old;$i++) @@ -282,7 +284,7 @@ foreach($str_arrname as $row) if($j==2) $ID_data[$ii][$k]=$grviz_name_list[$cell]; else - $ID_data[$ii][$k]=round($cell/10*900); + $ID_data[$ii][$k]=round((is_numeric($cell) ? $cell : 0)/10*900); $k++; } } @@ -349,15 +351,16 @@ foreach($str_arrname as $row) else if($j==4 && $flag==1) { $edge_data[$ii][4]=$cell; - $number_of_point=$cell*2; + $number_of_point=(is_numeric($cell) ? $cell : 0)*2; $index=5; } else if($j>4 && $number_of_point>0 && $flag==1) { + $cell_num=is_numeric($cell) ? $cell : 0; if(($j%2)!=0) - $edge_data[$ii][$index]=round($cell/10*900)+60; + $edge_data[$ii][$index]=round($cell_num/10*900)+60; else - $edge_data[$ii][$index]=round($cell/10*900)+48; + $edge_data[$ii][$index]=round($cell_num/10*900)+48; $number_of_point--; $index++; } diff --git a/sourcecodes/network_layout_inv.php b/sourcecodes/network_layout_inv.php index d457212e..4b0be904 100644 --- a/sourcecodes/network_layout_inv.php +++ b/sourcecodes/network_layout_inv.php @@ -53,6 +53,7 @@ $datamat=array(); $data_read=array(); $node=trim($str_arrmat[0]); +$node=is_numeric($node) ? $node : 0; $width=150; $height=150; $font=12; diff --git a/sourcecodes/network_layout_inv_2.php b/sourcecodes/network_layout_inv_2.php index e6e9b128..cedb3782 100644 --- a/sourcecodes/network_layout_inv_2.php +++ b/sourcecodes/network_layout_inv_2.php @@ -191,6 +191,7 @@ exit; } $node=trim($str_arrmat[1]); +$node=is_numeric($node) ? $node : 0; @@ -314,6 +315,7 @@ $str_arrmat_old=explode("\n",$matrix1_old); $datamat_old=array(); $data_read_old=array(); $node_old=trim($str_arrmat_old[0]); +$node_old=is_numeric($node_old) ? $node_old : 0; $r_index_old=$node_old+2; for($i=0;$i<$node_old;$i++) @@ -410,7 +412,7 @@ foreach($str_arrname as $row) if($j==2) $ID_data[$ii][$k]=$grviz_name_list[$cell]; else - $ID_data[$ii][$k]=round($cell/10*900); + $ID_data[$ii][$k]=round((is_numeric($cell) ? $cell : 0)/10*900); // echo $ID_data[$ii][$k]; //echo ' '; @@ -491,15 +493,16 @@ foreach($str_arrname as $row) else if($j==4 && $flag==1) { $edge_data[$ii][4]=$cell; - $number_of_point=$cell*2; + $number_of_point=(is_numeric($cell) ? $cell : 0)*2; $index=5; } else if($j>4 && $number_of_point>0 && $flag==1) { + $cell_num=is_numeric($cell) ? $cell : 0; if(($j%2)!=0) - $edge_data[$ii][$index]=round($cell/10*900)+60;//+30+30; + $edge_data[$ii][$index]=round($cell_num/10*900)+60;//+30+30; else - $edge_data[$ii][$index]=round($cell/10*900)+48;//+18+30; + $edge_data[$ii][$index]=round($cell_num/10*900)+48;//+18+30; $number_of_point--; $index++; diff --git a/sourcecodes/remove_variables.php b/sourcecodes/remove_variables.php index 0d925050..04d2ce9a 100644 --- a/sourcecodes/remove_variables.php +++ b/sourcecodes/remove_variables.php @@ -64,7 +64,7 @@ if($structure_thr=="") $nf=$dir.$keyval."nnode.txt"; $node=trim(file_get_contents("$nf")); -$maxplist=$node-1; +$maxplist=(is_numeric($node) ? $node : 0)-1; //print default number of parents $pfile=$dir.$keyval."parent.txt"; diff --git a/sourcecodes/runtime_check.php b/sourcecodes/runtime_check.php index 7b468957..35c62317 100644 --- a/sourcecodes/runtime_check.php +++ b/sourcecodes/runtime_check.php @@ -9,9 +9,11 @@ function exe_time($keyval,$parent_number,$k_number) $nrf = $dir.$keyval."nrows.txt"; $nrows=trim(file_get_contents("$nrf")); +$nrows=is_numeric($nrows) ? $nrows : 0; $nf=$dir.$keyval."nnode.txt"; -$node=trim(file_get_contents("$nf"))-1; +$node=trim(file_get_contents("$nf")); +$node=(is_numeric($node) ? $node : 0)-1; $parent_number=$parent_number-1; if($parent_number>$node) { -- cgit 1.4.1