On Wed, Jan 12 2022, Taylor Blau wrote: > On Wed, Jan 12, 2022 at 01:47:40PM +0100, Ævar Arnfjörð Bjarmason wrote: >> >> Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@xxxxxxxxx> >> >> --- >> >> reftable/refname.c | 1 - >> >> reftable/writer.c | 1 - >> >> 2 files changed, 2 deletions(-) >> >> >> >> diff --git a/reftable/refname.c b/reftable/refname.c >> >> index 95734969324..136001bc2c7 100644 >> >> --- a/reftable/refname.c >> >> +++ b/reftable/refname.c >> >> @@ -132,7 +132,6 @@ static int validate_refname(const char *name) >> >> return REFTABLE_REFNAME_ERROR; >> >> name = next + 1; >> >> } >> >> - return 0; >> >> } >> > >> > In this case the loop inside of validate_refname() should always >> > terminate the function within the loop body. But removing this return >> > statement here relies on the compiler to determine that fact. >> > >> > I could well imagine on the other end of the spectrum there exists a >> > compiler which _doesn't_ make this inference pass, and would complain >> > about the opposite thing as you're reporting from SunCC (i.e., that this >> > function which returns something other than void does not have a return >> > statement outside of the loop). >> > >> > So in that sense, I disagree with the guidance of SunCC's warning. In >> > other words: by quelching this warning under one compiler, are we >> > introducing a new warning under a different/less advanced compiler? >> >> I'd think that any compiler who'd warn about this sort of thing at all >> would be able to spot constructs like this one, which are basically: >> >> while (1) { >> ... >> if (x) >> return; >> ... >> } >> return; /* unreachable */ >> >> Where the elided code contains no "break", "goto" or other mechanism for >> exiting the for-loop. >> >> I.e. GCC and Clang don't bother to note the unreachable code, but I >> don't think the reverse will be true, that a compiler will say that a >> "return" is missing there. Having a function be just a loop body that >> returns an some point is a common pattern. > > Right, but I'm more concerned about a less advanced compiler that would > complain about the absence of a `return` statement as the last > instruction in a non-void function. > > This is probably all academic, anyway, since less advanced compilers > probably have other issues compiling Git as it stands today, but > fundamentally I think that SunCC's warnings here are at the very least > inconsiderate of less advanced compilers. > > To me, the safest thing to do would be to leave the code as-is and drop > this patch. I really don't see that, sorry. We have an actual example of a compliler that does emit a warning new in this rc on this code, but AFAICT your concern is purely hypothetical. Such a hypothetical compiler would already be emitting a firehose of false-positive warnings in our or any non-trivial C codebase, e.g. builtin/bisect--helper.c:bisect_run(), show-branch.c:version_cmp() and fsck.c:count_leading_dotdots() would all warn (and I just picked three examples from a quick grep, there's a lot more of them). So I don't think we need to be concerned about such a hypothetical compiler. I think anyone doing such flow analysis tries to do it well enough to not make the warning entirely useless. Aside: SunCC does get it wrong in some cases, but it's more obscure code, mainly from jumping into a for-loop via "goto", and not propagating understanding the implications of NORETURN in some cases (or maybe we're just using the GCC-specific one in that case).