Bug 106569 - enhancement: use STL algorithm instead of a raw loop
Summary: enhancement: use STL algorithm instead of a raw loop
Status: UNCONFIRMED
Alias: None
Product: gcc
Classification: Unclassified
Component: c (show other bugs)
Version: 12.0
: P3 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2022-08-09 07:43 UTC by David Binderman
Modified: 2022-08-12 22:28 UTC (History)
1 user (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description David Binderman 2022-08-09 07:43:09 UTC
Static analyser cppcheck can produce these style messages for gcc trunk source code:

$ fgrep useStlAlgorithm cppcheck.20220809.out
trunk.git/gcc/analyzer/call-string.cc:169:9: style: Consider using std::count_if algorithm instead of a raw loop. [useStlAlgorithm]
trunk.git/gcc/analyzer/constraint-manager.cc:2454:0: style: Consider using std::find_if algorithm instead of a raw loop. [useStlAlgorithm]
trunk.git/gcc/analyzer/region-model-manager.cc:1230:0: style: Consider using std::any_of algorithm instead of a raw loop. [useStlAlgorithm]
trunk.git/gcc/analyzer/region.cc:1245:0: style: Consider using std::any_of algorithm instead of a raw loop. [useStlAlgorithm]
trunk.git/gcc/cp/constexpr.cc:348:0: style: Consider using std::any_of algorithm instead of a raw loop. [useStlAlgorithm]
trunk.git/gcc/cp/constexpr.cc:5965:8: style: Consider using std::find_if algorithm instead of a raw loop. [useStlAlgorithm]
trunk.git/gcc/cp/constexpr.cc:8991:0: style: Consider using std::any_of algorithm instead of a raw loop. [useStlAlgorithm]
trunk.git/gcc/rtl-ssa/change-utils.h:28:0: style: Consider using std::any_of algorithm instead of a raw loop. [useStlAlgorithm]
trunk.git/gcc/rtl-ssa/blocks.cc:347:0: style: Consider using std::any_of algorithm instead of a raw loop. [useStlAlgorithm]
trunk.git/gcc/rtl-ssa/accesses.cc:1507:7: style: Consider using std::any_of algorithm instead of a raw loop. [useStlAlgorithm]
trunk.git/gcc/rtl-ssa/member-fns.inl:854:0: style: Consider using std::any_of algorithm instead of a raw loop. [useStlAlgorithm]
trunk.git/libsanitizer/hwasan/hwasan_thread_list.h:120:20: style: Consider using std::find_if algorithm instead of a raw loop. [useStlAlgorithm]
trunk.git/libsanitizer/hwasan/hwasan_report.cpp:293:0: style: Consider using std::find_if algorithm instead of a raw loop. [useStlAlgorithm]
$ 

None, some or all of these might be worth fixing.

I suspect it would not be worthwhile to implement this style warning in gcc.
Comment 1 Richard Biener 2022-08-09 13:50:14 UTC
I find those less obvious, for example does std::any_of guarantee some evaluation order?
Comment 2 David Binderman 2022-08-09 14:07:02 UTC
(In reply to Richard Biener from comment #1)
> I find those less obvious, for example does std::any_of guarantee some
> evaluation order?

I also find any_of less obvious, but that's because my working knowledge
of C++ stopped about 20 years ago.

According to

https://cplusplus.com/reference/algorithm/any_of/

there is no guarantee of evaluation order.

My best guess is that if gcc trunk is written in some recent version of C++,
then all that recent version can be used.
Comment 3 Martin Liška 2022-08-09 18:23:46 UTC
> My best guess is that if gcc trunk is written in some recent version of C++,
> then all that recent version can be used.

We are written in C++11, is std::find_if available in the given standard?
Comment 4 David Binderman 2022-08-09 18:57:07 UTC
(In reply to Martin Liška from comment #3)
> > My best guess is that if gcc trunk is written in some recent version of C++,
> > then all that recent version can be used.
> 
> We are written in C++11, is std::find_if available in the given standard?

Yes, there is *a* version of std::find_if available. Some additional
work might be needed to verify exact match.
Comment 5 Jonathan Wakely 2022-08-12 21:43:36 UTC
(In reply to David Binderman from comment #0)
> Static analyser cppcheck can produce these style messages for gcc trunk
> source code:
> 
> $ fgrep useStlAlgorithm cppcheck.20220809.out
> trunk.git/gcc/analyzer/call-string.cc:169:9: style: Consider using
> std::count_if algorithm instead of a raw loop. [useStlAlgorithm]

I don't think count_if would work here. I haven't looked at the others yet, but this first one seems like a useless suggestion.
Comment 6 Jonathan Wakely 2022-08-12 21:44:31 UTC
(In reply to David Binderman from comment #2)
> According to
> 
> https://cplusplus.com/reference/algorithm/any_of/

cplusplus.com is garbage, use cppreference.com
Comment 7 Jonathan Wakely 2022-08-12 21:48:06 UTC
std::find_if exists since c++98.

I'll go through these in a couple of weeks, it's probably not productive for people who don't know the C++ std::lib well to bother analysing the suggestions.
Comment 8 Jonathan Wakely 2022-08-12 22:28:25 UTC
(In reply to Jonathan Wakely from comment #5)
> (In reply to David Binderman from comment #0)
> > Static analyser cppcheck can produce these style messages for gcc trunk
> > source code:
> > 
> > $ fgrep useStlAlgorithm cppcheck.20220809.out
> > trunk.git/gcc/analyzer/call-string.cc:169:9: style: Consider using
> > std::count_if algorithm instead of a raw loop. [useStlAlgorithm]
> 
> I don't think count_if would work here. I haven't looked at the others yet,
> but this first one seems like a useless suggestion.

The other suggestions for gcc/analyzer/*.cc look correct, or at least, not incorrect, but not all of them would improve clarity. Similarly for the gcc/cp/constexpr.cc suggestions. They would need a lambda expression that captures local variables, and then compare the result of the algorithm to the end iterator of the range. I don't think that would improve the code. It would certainly be more lines of code.