Re: [PATCH] bug: Fix no-return-statement warning with !CONFIG_BUG

From: Michael Ellerman
Date: Sun Apr 14 2024 - 22:20:10 EST


"Arnd Bergmann" <arnd@xxxxxxxx> writes:
> On Thu, Apr 11, 2024, at 11:27, Adrian Hunter wrote:
>> On 11/04/24 11:22, Christophe Leroy wrote:
>>> Le 11/04/2024 à 10:12, Christophe Leroy a écrit :
>>>>
>>>> Looking at the report, I think the correct fix should be to use
>>>> BUILD_BUG() instead of BUG()
>>>
>>> I confirm the error goes away with the following change to next-20240411
>>> on powerpc tinyconfig with gcc 13.2
>>>
>>> diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c
>>> index 4e18db1819f8..3d5ac0cdd721 100644
>>> --- a/kernel/time/timekeeping.c
>>> +++ b/kernel/time/timekeeping.c
>>> @@ -282,7 +282,7 @@ static inline void timekeeping_check_update(struct
>>> timekeeper *tk, u64 offset)
>>> }
>>> static inline u64 timekeeping_debug_get_ns(const struct tk_read_base *tkr)
>>> {
>>> - BUG();
>>> + BUILD_BUG();
>>> }
>>> #endif
>>>
>>
>> That is fragile because it depends on defined(__OPTIMIZE__),
>> so it should still be:
>
> If there is a function that is defined but that must never be
> called, I think we are doing something wrong.

It's a pretty inevitable result of using IS_ENABLED(), which the docs
encourage people to use.

In this case it could easily be turned into a build error by just making
it an extern rather than a static inline.

But I think Christophe's solution is actually better, because it's more
explicit, ie. this function should not be called and if it is that's a
build time error.

cheers