Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/shtrih/symfony-validator-heisenbug
How to bug
https://github.com/shtrih/symfony-validator-heisenbug
Last synced: 16 days ago
JSON representation
How to bug
- Host: GitHub
- URL: https://github.com/shtrih/symfony-validator-heisenbug
- Owner: shtrih
- Created: 2017-11-30T13:12:20.000Z (about 7 years ago)
- Default Branch: master
- Last Pushed: 2017-12-01T10:48:42.000Z (about 7 years ago)
- Last Synced: 2024-10-30T18:26:35.668Z (2 months ago)
- Language: PHP
- Size: 13.7 KB
- Stars: 0
- Watchers: 3
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: Readme.md
Awesome Lists containing this project
README
Этот код демонстрирует проявление бага, связанного с тем, что symfony/validator [полагается](https://github.com/symfony/symfony/blob/7bab5b265614de241913db27cb6654cca91f477d/src/Symfony/Component/Validator/Validator/RecursiveContextualValidator.php#L112) [на](https://github.com/symfony/symfony/blob/7bab5b265614de241913db27cb6654cca91f477d/src/Symfony/Component/Validator/Validator/RecursiveContextualValidator.php#L341) результат функции `spl_object_hash`, которая не гарантирует уникальность хеша из-за gc. Когда на класс перестают ссылаться, он уничтожается, однако при создании нового объекта, хеш вышеупомянутого уничтоженного класса может быть присвоен новому объекту.
Таким образом, непровалидированный объект, получая хеш уничтоженного успешно провалидированного объекта, [считается валидированным](https://github.com/symfony/symfony/blob/7bab5b265614de241913db27cb6654cca91f477d/src/Symfony/Component/Validator/Validator/RecursiveContextualValidator.php#L484-L489) и его проверка скипается.
```php
# http://php.net/manual/en/function.spl-object-hash.php#76220
# https://3v4l.org/gDgic
class Foo {}
class Bar {
public $baz = 42;
}$a = new Foo;
$hashA = spl_object_hash($a);unset($a);
$b = new Bar;
$hashB = spl_object_hash($b);var_dump($hashA === $hashB); // true
```------
Здесь реализована валидация данных в `\App\Entity\Fields\Field::$value`, основываясь на типе поля `\App\Entity\Fields\Field::$type`.
------
**Суть проблемы:** при использовании кастомного валидатора, невалидные данные в полях **иногда** не проверяются и пропускаются как валидные.**Решение:** хранить объекты, создаваемые в `Validator/Constraints/ValueByTypeValidator.php:30` до конца валидации.
Но, в целом, это поведение неочевидно и его последствия могут долго проявляться в виде плавающего бага.