bugprone-missing-end-comparison¶
Finds instances where the result of a standard algorithm is used in a Boolean context without being compared to the end iterator.
Standard algorithms such as std::find, std::search, and
std::lower_bound return an iterator to the element if found, or the end
iterator otherwise.
Using the result directly in a Boolean context (like an if statement) is
almost always a bug, as it only checks if the iterator itself evaluates to
true, which may always be true for many iterator types.
Examples:
void example() {
int arr[] = {1, 2, 3};
int* begin = std::begin(arr);
int* end = std::end(arr);
if (std::find(begin, end, 2)) {
// ...
}
// Fixed by the check:
if ((std::find(begin, end, 2) != end)) {
// ...
}
// C++20 ranges:
int v[] = {1, 2, 3};
if (std::ranges::find(v, 2)) {
// ...
}
// Fixed by the check:
if ((std::ranges::find(v, 2) != std::ranges::end(v))) {
// ...
}
}
The check also handles range-based algorithms introduced in C++20.
Supported algorithms:
std::adjacent_findstd::findstd::find_endstd::find_first_ofstd::find_ifstd::find_if_notstd::is_sorted_untilstd::lower_boundstd::max_elementstd::min_elementstd::partition_pointstd::searchstd::search_nstd::upper_boundstd::ranges::adjacent_findstd::ranges::findstd::ranges::find_first_ofstd::ranges::find_ifstd::ranges::find_if_notstd::ranges::is_sorted_untilstd::ranges::lower_boundstd::ranges::max_elementstd::ranges::min_elementstd::ranges::upper_bound
Options¶
- ExtraAlgorithms¶
A semicolon-separated list of extra algorithms to check. The list can contain:
Iterator-based algorithms. These should follow the standard iterator pattern:
func(Iter, Iter, ...).Range-based algorithms. These are heuristically detected if they take exactly two arguments and the first argument is a container or range. The fix will insert
std::end(Container).
Default is an empty string.