vimeo / psalm

A static analysis tool for finding errors in PHP applications
https://psalm.dev
MIT License
5.56k stars 660 forks source link

Add support for new types (like CurlHandle) in PHP8 #3824

Closed xPaw closed 1 year ago

xPaw commented 4 years ago

https://github.com/php/php-src/blob/master/UPGRADING

  1. curl_init() will now return a CurlHandle object rather than a resource.
  2. curl_multi_init() will now return a CurlMultiHandle object rather than a resource.
  3. curl_share_init() will now return a CurlShareHandle object rather than a resource.
  4. shmop_open() will now return a Shmop object rather than a resource.
  5. enchant_broker_init() will now return an EnchantBroker object rather than a resource.
  6. The GD extension now uses objects as the underlying data structure for images, rather than resources.
  7. msg_get_queue() will now return an SysvMessageQueue object rather than a resource.
  8. sem_get() will now return an SysvSemaphore object rather than a resource.
  9. shm_attach() will now return an SysvSharedMemory object rather than a resource.
  10. xml_parser_create(_ns) will now return an XmlParser object rather than a resource.
  11. inflate_init() will now return an InflateContext object rather than a resource.
  12. deflate_init() will now return a DeflateContext object rather than a resource.
  13. openssl_x509_read() and openssl_csr_sign() will now return an OpenSSLCertificate object rather than a resource.
  14. openssl_csr_new() will now return an OpenSSLCertificateSigningRequest object rather than a resource.
  15. openssl_pkey_new() will now return an OpenSSLAsymmetricKey object rather than a resource.
  16. socket_create(), socket_create_listen(), socket_accept(), socket_import_stream(), socket_addrinfo_connect(), socket_addrinfo_bind(), and socket_wsaprotocol_info_import() will now return a Socket object rather than a resource.
  17. socket_addrinfo_lookup() will now return an array of AddressInfo objects rather than resources.

All the related functions that previous took resource now take the object. is_resource does not work on them.

If I understand correctly, a CallMap delta for 8.0 needs to be created?

psalm-github-bot[bot] commented 4 years ago

Hey @xPaw, can you reproduce the issue on https://psalm.dev ?

weirdan commented 4 years ago

If I understand correctly, a CallMap delta for 8.0 needs to be created?

Yes.

xPaw commented 3 years ago

Would also be great to introduce a warning for functions like curl_close and imagedestroy to replace them with unset calls.

TysonAndre commented 3 years ago

One potential solution I thought of for analyzing forward compatibility would be to add a type such as resource<'CurlHandle'> or resource{CurlHandle} in the function signature maps and deltas for the older signatures. (e.g. curl_init would return that type, and curl_exec would accept that type as a param type, and so on. A generic resource would be allowed to cast to that type.)

derrabus commented 3 years ago

can you reproduce the issue on https://psalm.dev ?

https://psalm.dev/r/d9103abb4b

psalm-github-bot[bot] commented 3 years ago

I found these snippets:

https://psalm.dev/r/d9103abb4b ```php key = $key; } public function getKey(): \OpenSSLAsymmetricKey { return $this->key; } } ``` ``` Psalm output (using commit f496cca): ERROR: UndefinedClass - 5:13 - Class, interface or enum named OpenSSLAsymmetricKey does not exist ERROR: InvalidPropertyAssignmentValue - 13:22 - $this->key with declared type 'OpenSSLAsymmetricKey' cannot be assigned type 'resource' ERROR: UndefinedClass - 16:31 - Class, interface or enum named OpenSSLAsymmetricKey does not exist ```
kkmuffme commented 2 years ago

@orklah afaik this is implemented already now? (ticket can be closed?)

AndrolGenhald commented 2 years ago

Looks like we still need:

4. shmop_open() will now return a Shmop object rather than a resource. 5. enchant_broker_init() will now return an EnchantBroker object rather than a resource. 7. msg_get_queue() will now return an SysvMessageQueue object rather than a resource. 8. sem_get() will now return an SysvSemaphore object rather than a resource. 9. shm_attach() will now return an SysvSharedMemory object rather than a resource. 11. inflate_init() will now return an InflateContext object rather than a resource. 12. deflate_init() will now return a DeflateContext object rather than a resource.

TAS-EW-02 commented 2 years ago

In the current version (Psalm 4.26.0) I still get false-positives for PHP 8.0:

Class, interface or enum named CurlHandle does not exist (see https://psalm.dev/019)

It is the same message for all CURL related classes and constants (e.g. CURLOPT_URL).

weirdan commented 1 year ago

@derrabus OpenSSL snippet now does not produce errors: https://psalm.dev/r/d9103abb4b

psalm-github-bot[bot] commented 1 year ago

I found these snippets:

https://psalm.dev/r/d9103abb4b ```php key = $key; } public function getKey(): \OpenSSLAsymmetricKey { return $this->key; } } ``` ``` Psalm output (using commit 8f39de9): No issues! ```