1. Nov 02, 2023
    • Ralf W. Grosse-Kunstleve's avatar
      [smart_holder] Bug fix: `std::unique_ptr` deleter needs to be copied. (#4850) · 55105fbe
      Ralf W. Grosse-Kunstleve authored
      * Store `std::function<void (void *)>` del_fun; in `guarded_delete`
      
      * Specialize the simple common case.
      
      Using a `union` is complicated: https://en.cppreference.com/w/cpp/language/union
      
      > If members of a union are classes with user-defined constructors and destructors, to switch the active member, explicit destructor and placement new are generally needed:
      
      Using `std::variant` increases compile-time overhead.
      
      It is currently unclear how much these effects matter in practice: optimization left for later.
      
      * Add one test case (more later).
      
      * Add `const` to resolve clang-tidy error.
      
      ```
      -- The CXX compiler identification is Clang 15.0.7
      
      /usr/bin/cmake -E __run_co_compile --tidy="/usr/bin/clang-tidy;--use-color;--warnings-as-errors=*;--extra-arg-before=--driver-mode=g++" --source=/__w/pybind11/pybind11/tests/test_class_sh_inheritance.cpp -- /usr/bin/c++ -DPYBIND11_ENABLE_TYPE_CASTER_ODR_GUARD_IF_AVAILABLE -DPYBIND11_TEST_EIGEN -Dpybind11_tests_EXPORTS -I/__w/pybind11/pybind11/include -isystem /usr/include/python3.9 -isystem /__w/pybind11/pybind11/build/_deps/eigen-src -Os -DNDEBUG -fPIC -fvisibility=hidden -Wall -Wextra -Wconversion -Wcast-qual -Wdeprecated -Wundef -Wnon-virtual-dtor -flto=thin -std=c++17 -o CMakeFiles/pybind11_tests.dir/test_class_sh_inheritance.cpp.o -c /__w/pybind11/pybind11/tests/test_class_sh_inheritance.cpp
      /__w/pybind11/pybind11/tests/pure_cpp/smart_holder_poc_test.cpp:264:30: error: pointer parameter 'raw_ptr' can be pointer to const [readability-non-const-parameter,-warnings-as-errors]
              new int(19), [](int *raw_ptr) { delete raw_ptr; });
                                   ^
                              const
      ```
      
      * Introduce `struct custom_deleter` to ensure the deleter is moved as desired (the lambda function only captures a reference, which can become dangling).
      
      * Resolve helpful clang-tidy errors.
      
      ```
      /usr/bin/cmake -E __run_co_compile --tidy="/usr/bin/clang-tidy;--use-color;--warnings-as-errors=*;--extra-arg-before=--driver-mode=g++" --source=/__w/pybind11/pybind11/tests/test_class.cpp -- /usr/bin/c++ -DPYBIND11_ENABLE_TYPE_CASTER_ODR_GUARD_IF_AVAILABLE -DPYBIND11_TEST_EIGEN -Dpybind11_tests_EXPORTS -I/__w/pybind11/pybind11/include -isystem /usr/include/python3.9 -isystem /__w/pybind11/pybind11/build/_deps/eigen-src -Os -DNDEBUG -fPIC -fvisibility=hidden -Wall -Wextra -Wconversion -Wcast-qual -Wdeprecated -Wundef -Wnon-virtual-dtor -flto=thin -std=c++17 -o CMakeFiles/pybind11_tests.dir/test_class.cpp.o -c /__w/pybind11/pybind11/tests/test_class.cpp
      /__w/pybind11/pybind11/include/pybind11/detail/smart_holder_poc.h:114:5: error: single-argument constructors must be marked explicit to avoid unintentional implicit conversions [google-explicit-constructor,-warnings-as-errors]
          custom_deleter(D &&deleter) : deleter{std::move(deleter)} {}
          ^
          explicit
      /__w/pybind11/pybind11/include/pybind11/detail/smart_holder_poc.h:120:76: error: forwarding reference passed to std::move(), which may unexpectedly cause lvalues to be moved; use std::forward() instead [bugprone-move-forwarding-reference,-warnings-as-errors]
          return guarded_delete(std::function<void(void *)>(custom_deleter<T, D>(std::move(uqp_del))),
                                                                                 ^~~~~~~~~
                                                                                 std::forward<D>
      ```
      
      * Workaround for gcc 4.8.5, clang 3.6
      
      * Transfer reduced test here.
      
      Reduced from a PyCLIF use case in the wild by @wangxf123456 (internal change cl/565476030).
      
      * Add missing include (clangd Include Cleaner)
      
      * Change `std::move` to `std::forward` as suggested by @iwanders.
      
      * Add missing includes (clangd Include Cleaner)
      
      * Use new `PYBIND11_TESTS_PURE_CPP_SMART_HOLDER_POC_TEST_CPP` to exclude `smart_holder::as_unique_ptr` method from production code.
      
      * Systematically add `PYBIND11_TESTS_PURE_CPP_SMART_HOLDER_POC_TEST_CPP` to mark code that is not used from production code. Add comment to explain.
      
      * Very simple experiment related to https://github.com/pybind/pybind11/pull/4850#issuecomment-1789780676
      
      Does the `PYBIND11_TESTS_PURE_CPP_SMART_HOLDER_POC_TEST_CPP` define have anything to do with it?
      
      * Revert "Very simple experiment related to https://github.com/pybind/pybind11/pull/4850#issuecomment-1789780676"
      
      This reverts commit fe59369f408d354edef16e3d40e2f90d9c2a9ba8.
      55105fbe
  2. Oct 27, 2023
  3. Oct 25, 2023
  4. Oct 24, 2023
  5. Oct 22, 2023
  6. Oct 20, 2023
  7. Oct 18, 2023
  8. Oct 16, 2023
    • Pablo Speciale's avatar
      Update pytest to version 7.2.0 (which removes their dependency on py) (#4880) · 0cbd92ba
      Pablo Speciale authored
      * Update pytest (which removes their dependency on py)
      
      The py library through 1.11.0 for Python allows remote attackers to conduct a ReDoS (Regular expression Denial of Service) attack via a Subversion repository with crafted info data, because the InfoSvnCommand argument is mishandled.
      
      The particular codepath in question is the regular expression at py._path.svnurl.InfoSvnCommand.lspattern and is only relevant when dealing with subversion (svn) projects. Notably the codepath is not used in the popular pytest project. The developers of the pytest package have released version 7.2.0 which removes their dependency on py. Users of pytest seeing alerts relating to this advisory may update to version 7.2.0 of pytest to resolve this issue. See https://github.com/pytest-dev/py/issues/287#issuecomment-1290407715 for additional context.
      
      * Added conditions so that we keep using 7.0.0 on python 3.6
      0cbd92ba
  9. Oct 12, 2023
    • Ralf W. Grosse-Kunstleve's avatar
      90158694
    • Ralf W. Grosse-Kunstleve's avatar
      2c883562
    • Ralf W. Grosse-Kunstleve's avatar
      Add pybind11/gil_safe_call_once.h (to fix deadlocks in pybind11/numpy.h) (#4877) · 0e2c3e5d
      Ralf W. Grosse-Kunstleve authored
      * LazyInitializeAtLeastOnceDestroyNever v1
      
      * Go back to using `union` as originally suggested by jbms@. The trick (also suggested by jbms@) is to add empty ctor + dtor.
      
      * Revert "Go back to using `union` as originally suggested by jbms@. The trick (also suggested by jbms@) is to add empty ctor + dtor."
      
      This reverts commit e7b8c4f0fcd72191e88d1c17abf5da08fe3a9c6f.
      
      * Remove `#include <stdalign.h>`
      
      * `include\pybind11/numpy.h(24,10): fatal error C1083: Cannot open include file: 'stdalign.h': No such file or directory`
      
      * @tkoeppe wrote: this is a C interop header (and we're not writing C)
      
      * Suppress gcc 4.8.5 (CentOS 7) warning.
      
      ```
      include/pybind11/eigen/../numpy.h:63:53: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
               return *reinterpret_cast<T *>(value_storage_);
                                                           ^
      ```
      
      * Replace comments:
      
      Document PRECONDITION.
      
      Adopt comment suggested by @tkoeppe: https://github.com/pybind/pybind11/pull/4877#discussion_r1350356093
      
      * Adopt suggestion by @tkoeppe:
      
      * https://github.com/pybind/pybind11/pull/4877#issuecomment-1752969127
      
      * https://godbolt.org/z/Wa79nKz6e
      
      * Add `PYBIND11_CONSTINIT`, but it does not work for the current use cases:
      
      ```
      g++ -o pybind11/tests/test_numpy_array.os -c -std=c++20 -fPIC -fvisibility=hidden -O0 -g -Wall -Wextra -Wconversion -Wcast-qual -Wdeprecated -Wundef -Wnon-virtual-dtor -Wunused-result -Werror -isystem /usr/include/python3.11 -isystem /usr/include/eigen3 -DPYBIND11_STRICT_ASSERTS_CLASS_HOLDER_VS_TYPE_CASTER_MIX -DPYBIND11_ENABLE_TYPE_CASTER_ODR_GUARD_IF_AVAILABLE -DPYBIND11_TEST_BOOST -Ipybind11/include -I/usr/local/google/home/rwgk/forked/pybind11/include -I/usr/local/google/home/rwgk/clone/pybind11/include /usr/local/google/home/rwgk/forked/pybind11/tests/test_numpy_array.cpp
      ```
      
      ```
      In file included from /usr/local/google/home/rwgk/forked/pybind11/tests/test_numpy_array.cpp:10:
      /usr/local/google/home/rwgk/forked/pybind11/include/pybind11/numpy.h: In static member function ‘static pybind11::detail::npy_api& pybind11::detail::npy_api::get()’:
      /usr/local/google/home/rwgk/forked/pybind11/include/pybind11/numpy.h:258:82: error: ‘constinit’ variable ‘api_init’ does not have a constant initializer
        258 |         PYBIND11_CONSTINIT static LazyInitializeAtLeastOnceDestroyNever<npy_api> api_init;
            |                                                                                  ^~~~~~~~
      ```
      
      ```
      In file included from /usr/local/google/home/rwgk/forked/pybind11/tests/test_numpy_array.cpp:10:
      /usr/local/google/home/rwgk/forked/pybind11/include/pybind11/numpy.h: In static member function ‘static pybind11::object& pybind11::dtype::_dtype_from_pep3118()’:
      /usr/local/google/home/rwgk/forked/pybind11/include/pybind11/numpy.h:697:13: error: ‘constinit’ variable ‘imported_obj’ does not have a constant initializer
        697 |             imported_obj;
            |             ^~~~~~~~~~~~
      ```
      
      * Revert "Add `PYBIND11_CONSTINIT`, but it does not work for the current use cases:"
      
      This reverts commit f07b28bda9f91fb723aa898a21c81b6dd6857072.
      
      * Reapply "Add `PYBIND11_CONSTINIT`, but it does not work for the current use cases:"
      
      This reverts commit 36be645758aa82b576d24003808386bec6e55bf9.
      
      * Add Default Member Initializer on `value_storage_` as suggested by @tkoeppe:
      
      https://github.com/pybind/pybind11/pull/4877#issuecomment-1753201342
      
      This fixes the errors reported under commit f07b28bda9f91fb723aa898a21c81b6dd6857072.
      
      * Fix copy-paste-missed-a-change mishap in commit 88cec1152ab5576db19bab95c484672f06f5989a.
      
      * Semi-paranoid placement new (based on https://github.com/pybind/pybind11/pull/4877#discussion_r1350573114).
      
      * Move PYBIND11_CONSTINIT to detail/common.h
      
      * Move code to the right places, rename new class and some variables.
      
      * Fix oversight: update tests/extra_python_package/test_files.py
      
      * Get the name right first.
      
      * Use `std::call_once`, `std::atomic`, following a pattern developed by @tkoeppe
      
      * Make the API more self-documenting (and possibly more easily reusable).
      
      * google-clang-tidy IWYU fixes
      
      * Rewrite comment as suggested by @tkoeppe
      
      * Update test_exceptions.cpp and exceptions.rst
      
      * Fix oversight in previous commit: add `PYBIND11_CONSTINIT`
      
      * Make `get_stored()` non-const for simplicity.
      
      As suggested by @tkoeppe: not seeing any reasonable use in which `get_stored` has to be const.
      
      * Add comment regarding `KeyboardInterrupt` behavior, based heavily on information provided by @jbms.
      
      * Add `assert(PyGILState_Check())` in `gil_scoped_release` ctor (simple & non-simple implementation) as suggested by @EthanSteinberg.
      
      * Fix oversight in previous commit (missing include cassert).
      
      * Remove use of std::atomic, leaving comments with rationale, why it is not needed.
      
      * Rewrite comment re `std:optional` based on deeper reflection (aka 2nd thoughts).
      
      * Additional comment with the conclusion of a discussion under PR #4877.
      
      * https://github.com/pybind/pybind11/pull/4877#issuecomment-1757363179
      
      * Small comment changes suggested by @tkoeppe.
      0e2c3e5d
  10. Oct 06, 2023
  11. Oct 04, 2023
  12. Sep 28, 2023
  13. Sep 25, 2023
  14. Sep 16, 2023
  15. Sep 15, 2023
  16. Sep 13, 2023
  17. Sep 11, 2023
  18. Sep 07, 2023
  19. Sep 06, 2023
  20. Sep 02, 2023
  21. Aug 31, 2023