Skip to content

[PHP]: GPBUtil::checkFloat modifies the passed-in variable #17467

@bshaffer

Description

@bshaffer

From @SVillette in googleapis/google-cloud-php#7045. I am moving it here because it describes an issue in Google\Protobuf\Internal\GPBUtil. I was able to verify this is happening in the native PHP library and when the protobuf C extension is enabled.

To me this seems like a bug, as I don't know why a method called checkFloat should pass by reference / modify the behavior of the variable being checked. However, it looks like it was done quite intentionally

public static function checkFloat(&$var)
{
if (is_float($var) || is_numeric($var)) {
$var = unpack("f", pack("f", $var))[1];
} else {
throw new \Exception("Expect float.");
}
}

This requires further investigation.

**** copied from googleapis/google-cloud-php#7045 ****

Description

Hi guys,
I just installed this package and noticed a strange behaviour when an object of class Google\Cloud\RecaptchaEnterprise\V1\RiskAnalysis is hydrated from the json response when creating an assessment (especially the score property). I discovered this bug when I tested recaptcha behaviour with a score threshold of 0.9 and it failed because the score was 0.8999999761581421.

Environment details

  • OS: MacOS
  • PHP version: 8.2
  • Package name and version: googleapis/google-cloud-php-recaptcha-enterprise v1.8.1

Code example

$var = 0.9;
GPBUtil::checkFloat($var);
var_dump($var);

$var = 0.7;
GPBUtil::checkFloat($var);
var_dump($var);

$var = 0.3;
GPBUtil::checkFloat($var);
var_dump($var);

$var = 0.1;
GPBUtil::checkFloat($var);
var_dump($var);

The output is the following : (from https://3v4l.org/CgGYZ)

8.0 - 8.3
float(0.8999999761581421) 
float(0.699999988079071) 
float(0.30000001192092896) 
float(0.10000000149011612)
5.4 - 8.0
float(0.89999997615814)
float(0.69999998807907)
float(0.30000001192093)
float(0.10000000149012)

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions