Skip to content
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

chore: help Coverty avoid generating a false positive. #4817

Merged
merged 4 commits into from
Sep 1, 2023
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 10 additions & 8 deletions include/pybind11/pybind11.h
Original file line number Diff line number Diff line change
Expand Up @@ -719,7 +719,7 @@ class cpp_function : public function {
/* Iterator over the list of potentially admissible overloads */
const function_record *overloads = reinterpret_cast<function_record *>(
PyCapsule_GetPointer(self, get_function_record_capsule_name())),
*it = overloads;
*current_overload = overloads;
assert(overloads != nullptr);

/* Need to know how many arguments + keyword arguments there are to pick the right
Expand Down Expand Up @@ -757,9 +757,10 @@ class cpp_function : public function {
std::vector<function_call> second_pass;

// However, if there are no overloads, we can just skip the no-convert pass entirely
const bool overloaded = it != nullptr && it->next != nullptr;
const bool overloaded
= current_overload != nullptr && current_overload->next != nullptr;

for (; it != nullptr; it = it->next) {
for (; current_overload != nullptr; current_overload = current_overload->next) {

/* For each overload:
1. Copy all positional arguments we were given, also checking to make sure that
Expand All @@ -780,7 +781,7 @@ class cpp_function : public function {
a result other than PYBIND11_TRY_NEXT_OVERLOAD.
*/

const function_record &func = *it;
const function_record &func = *current_overload;
size_t num_args = func.nargs; // Number of positional arguments that we need
if (func.has_args) {
--num_args; // (but don't count py::args
Expand Down Expand Up @@ -1018,10 +1019,10 @@ class cpp_function : public function {
}

if (result.ptr() != PYBIND11_TRY_NEXT_OVERLOAD) {
// The error reporting logic below expects 'it' to be valid, as it would be
// if we'd encountered this failure in the first-pass loop.
// The error reporting logic below expects 'current_overload' to be valid,
// as it would be if we'd encountered this failure in the first-pass loop.
if (!result) {
it = &call.func;
current_overload = &call.func;
}
break;
}
Expand Down Expand Up @@ -1168,7 +1169,8 @@ class cpp_function : public function {
if (!result) {
std::string msg = "Unable to convert function return value to a "
"Python type! The signature was\n\t";
msg += it->signature;
assert(current_overload != nullptr);
msg += current_overload->signature;
append_note_if_missing_header_is_suspected(msg);
// Attach additional error info to the exception if supported
if (PyErr_Occurred()) {
Expand Down
Loading