Skip to content

Add more precise return types for the openssl cipher functions #4043

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: 1.12.x
Choose a base branch
from

Conversation

stof
Copy link
Contributor

@stof stof commented Jun 4, 2025

Those functions return false (and trigger a warning) only when the argument is an unknown algorithm, which is not something worth checking when using them with a known algorithm.

I'm providing this improvement only on PHP 8+, because PHP 7 can have other kind of warnings (that have been upgraded to ValueError in PHP 8)

Replaces #3582

@stof stof force-pushed the better_openssl_types branch from 6144182 to ecfa6c2 Compare June 4, 2025 11:40
Comment on lines 38 to 63
public function getTypeFromFunctionCall(FunctionReflection $functionReflection, FuncCall $functionCall, Scope $scope): Type
{
$returnType = ParametersAcceptorSelector::selectFromArgs(
$scope,
$functionCall->getArgs(),
$functionReflection->getVariants(),
)->getReturnType();

if (!$this->phpVersion->throwsValueErrorForInternalFunctions()) {
return $returnType;
}

if (count($functionCall->getArgs()) < 1) {
return $returnType;
}

$strings = $scope->getType($functionCall->getArgs()[0]->value)->getConstantStrings();
$results = array_unique(array_map(fn (ConstantStringType $algorithm): bool => $this->isSupportedAlgorithm($algorithm->getValue()), $strings));

if (count($results) === 1) {
return $results[0]
? TypeCombinator::remove($returnType, new ConstantBooleanType(false))
: new ConstantBooleanType(false);
}

return $returnType;
Copy link
Contributor

@staabm staabm Jun 4, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

instead of

$returnType = ParametersAcceptorSelector::selectFromArgs(
			$scope,
			$functionCall->getArgs(),
			$functionReflection->getVariants(),
		)->getReturnType();

you can just return null; for the cases where the extension cannot provide a better type then the default.
that way you can simplify the extension a bit.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I refactored the code to return null for all such cases.

return in_array(strtoupper($algorithm), $this->getSupportedAlgorithms(), true);
}

/** @return string[] */
Copy link
Contributor

@staabm staabm Jun 4, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

might work to use a more precise return type

Suggested change
/** @return string[] */
/** @return uppercase-string[] */

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I inspired from MbFunctionsReturnTypeExtensionTrait, which also uses simply string[]

@stof stof force-pushed the better_openssl_types branch from ecfa6c2 to bb6367d Compare June 4, 2025 12:47
@staabm
Copy link
Contributor

staabm commented Jun 4, 2025

Needs cs fix

@stof stof force-pushed the better_openssl_types branch from bb6367d to 1e9efb6 Compare June 5, 2025 08:32
@stof
Copy link
Contributor Author

stof commented Jun 5, 2025

@staabm done

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants