Re: agetty.c warnings

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 04/01/11 15:52, Karel Zak wrote:
> On Tue, Jan 04, 2011 at 03:04:14PM +0000, PÃdraig Brady wrote:
>> On 04/01/11 14:37, Karel Zak wrote:
>>> On Tue, Jan 04, 2011 at 11:53:21AM +0000, PÃdraig Brady wrote:
>>>> On 01/01/11 22:56, Karel Zak wrote:
>>>>> On Sat, Jan 01, 2011 at 08:59:02PM +0000, Jon Grant wrote:
>>>>>> Just building latest code and saw the compiler generated some
>>>>>> warnings.  Just thinking, one idea is to check the return value, and
>>>>>
>>>>>  the warn_unused_result for write() in glibc is pretty idiotic...
>>>>>
>>>>>> use it as best possible (even just for trace) or (void)bytes to make
>>>>>> it go quiet when there really is no use.
>>>>>
>>>>>  (void) foo()  is mess and it has no effect for warn_unused_result 
>>>>>
>>>>>> bytes  = write(1, "\n", 1);
>>>>>
>>>>>  hmm.. possible solution is to call error() (but I'm not sure if this
>>>>>  is appropriate solution for unimportant things like /etc/issue) or
>>>>>  really ignore the return value. It would be nice to have a macro that
>>>>>  allows to ignore the return values in some cases
>>>>>
>>>>>     ignore_result( write(1, "\n", 1) );
>>>>
>>>> We use something like that in coreutils:
>>>> http://git.sv.gnu.org/gitweb/?p=gnulib.git;a=blob;f=lib/ignore-value.h;hb=HEAD
>>>
>>>  Nice, but it does not work for all types, what about:
>>>
>>>     #define ignore(x) ({ typeof(x) __rc = (x); })
>>
>> That looks right for util-linux but
>> is probably not portable enough for gnulib.
> 
> Good point.
> 
>> Also I'd be slightly worried that clang-analyzer
>> would start complaining about dead stores with that.
> 
> It seems that clang is not so pedantic, but gcc -Wall prints warning
> about unused variable â__fooâ, so it's necessary to use the variable
> somehow...
> 
>         $ cat a.c
>         #include <stdio.h>
> 
>         static int __attribute__((warn_unused_result)) foo(void) { return 0; };
> 
>         #define ignore(x) ({ typeof(x) __foo = (x); (void) __foo; })
> 
>         int main(int argc, char **argv)
>         {
>             ignore( foo() );
>             return 0;
>         }
> 
> 
>         $ scan-build  gcc -c a.c 
>         ANALYZE: a.c foo
>         ANALYZE: a.c main
>         scan-build: Removing directory '/tmp/scan-build-2011-01-04-1' because it contains no reports.

Thanks for confirming that.
The above should work for aggregate types also,
so looks good for util-linux

>> Perhaps this might work?
>>
>> static inline void _ignore (int i) { (void) i; }
>> #define ignore(x) _ignore ((int)x)
> 
> I don't think so, it will produce warnings about cast from pointer to
> integer if the function (foo() in my example) returns a pointer. 

Ah right, there would be a warning when the pointer
size is different to the int. So this would be better:

#include <stdint.h>
static inline void _ignore (intptr_t p) { (void) p; }
#define ignore(x) _ignore ((intptr_t)x)

But that still doesn't work for aggregate types.

cheers,
PÃdraig.
--
To unsubscribe from this list: send the line "unsubscribe util-linux" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Netdev]     [Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux