RFR(S): 8252407: Build failure with gcc-8+ and asan

Eric Liu eric.c.liu at arm.com
Mon Sep 7 14:56:53 UTC 2020


Hi Kim:

Thanks for the discussion, this makes more sense to me now. 

> Kim Barrett <kim.barrett at oracle.com> on 06 September 2020 19:35 wrote:
> 
> Can you be (very) specific about this.  Do all of these changes cause gcc10 to warn?  Or
> do only some of them.  If only some, specifically which ones? I have a conjecture about
> some of them (see below).  (I should probably try this myself; I know we have done some
> testing with gcc10, but I don’t remember where to find that devkit.)

I have tested 4 cases for those warnings:
a) Without my patch, without asan, gcc-8 and gcc-10 are OK.
b) Without my patch, with asan, gcc-8 has warned, gcc-10 is OK.
c) With my patch, without asan, gcc-8 and gcc-10 are OK.
d) With my patch, with asan, gcc-8 is OK, gcc-10 has warned.

Those warnings can be reported by both gcc-8 and gcc-10 only when asan enabled. Without
asan, no warning would be found even through some of them doesn't align with the documentation.

> ------------------------------------------------------------------------------
> src/java.base/unix/native/libnet/NetworkInterface.c
> 232     strncpy(searchName, name_utf, IFNAMESIZE - 1);
> 
> A better solution here would be to eliminate the strncpy entirely.
> 
> The strncpy is used to make a copy of a string so the copy can be
> searched for a colon, and if one is found, terminate the string there.
> 
> But there's no need to make such a copy.  The string being copied is
> the local temporary string name_utf.  We could instead use name_utf
> everywhere searchName is currently used, including clobbering the
> first colon to NUL.  We'd have to undo that before the later loop at
> line 249, but we have the information needed to do so.

Yes, this copy seems unnecessary. I was thinking whether it's a good way to find parent
by using strstr, so that we can not have to recover the zero. Will that be much slower?

> ------------------------------------------------------------------------------
> src/java.base/unix/native/libnet/NetworkInterface.c
> 1298     memset((char *)&if2, 0, sizeof(if2));
> 1299     strncpy(if2.ifr_name, name, sizeof(if2.ifr_name) - 1);
> 1300     if2.ifr_name[sizeof(if2.ifr_name) - 1] = 0;
> 
> (in getIndex)
> 
> So gcc8 does not warn about this, but gcc10 does? That would be a
> regression in gcc10 (and should be reported as such), because the
> documentation for -Wstringop-truncate is clear that the above is the
> proper idiom for avoiding the warning.

Yse, I followed the documentation and gcc-8 does not warn about this, but
gcc-10 does (both with asan enabled). 

> Regardless, the memset on 1298 is useless.  The code from before
> JDK-8250863 was the memset then the strncpy with
> sizeof(if2.ifr_name)-1 as the bound, which worked because the memset
> would have zeroed the last element.
> 
> The change for JDK-8250863 did not follow the documented idiom though.
> 
> It would be interesting to find out if removal of the memset changes
> anything.  It's barely conceivable that it's confusing the heuristics
> used to decide whether -Wstringop-truncation should trigger.  For
> example, the compiler might decide that the subsequent assignment of
> the last element is unnecessary because of the memset and optimize the
> assignment away, removing the idiomatic warning suppression.
> 
> If gcc10 still warns about the above after removing the memset then I
> see little recourse but to use PRAGMA_STRINGOP_TRUNCATION_IGNORED here.
>
> Similarly for the strncpy in getFlags:
> 1362     memset((char *)&if2, 0, sizeof(if2));
> 1363     strncpy(if2.ifr_name, ifname, sizeof(if2.ifr_name) - 1);
> 1364     if2.ifr_name[sizeof(if2.ifr_name) - 1] = 0;

After removing the memset, gcc-10(10.1.0) still warns about it, gcc-8 and gcc-9 also.

> ------------------------------------------------------------------------------
> src/java.base/unix/native/libnet/NetworkInterface.c
>  937     strncpy(name, if_name, IFNAMESIZE - 1);
>  938     name[IFNAMESIZE - 1] = '\0';
> 
> gcc10 presumably did not complain about the old version here, and this
> was not touched as part of JDK-8250863.  Does gcc10 complain about
> this new version?  If so, then I see little recoarse but to use
> PRAGMA_STRINGOP_TRUNCATION_IGNORED here, because a gcc10 warning here
> is contrary to the documentation.

Yes, gcc-10 would warn about this both before and after my patch if asan enabled.


> ------------------------------------------------------------------------------
> src/java.desktop/unix/native/libawt_xawt/awt/awt_InputMethod.c
> est/hotspot/jtreg/vmTestbase/nsk/jvmti/scenarios/events/EM04/em04t001/em04t001.cpp
> 
> These changes look good, as they follow the documented idiom for
> suppressing -Wstringop-truncation. Does gcc10 warn after these changes?

Gcc-10 does'n warn about this changes.

> ------------------------------------------------------------------------------
> test/jdk/java/nio/channels/spi/SelectorProvider/inheritedChannel/libInheritedChannel.c
> (In Java_UnixDomainSocket_bind0)  
> 234     memset(&addr, 0, sizeof(addr));
> 235     addr.sun_family = AF_UNIX;
> 236     strncpy(addr.sun_path, nameUtf, length - 1);
> 237     addr.sun_path[length - 1] = '\0';
> 
> (In Java_UnixDomainSocket_connect0)
> 267     memset(&addr, 0, sizeof(addr));
> 268     addr.sun_family = AF_UNIX;
> 269     strncpy(addr.sun_path, nameUtf, length - 1);
> 270     addr.sun_path[length - 1] = '\0';
>
> These changes look good, as they follow the documented idiom for
> suppressing -Wstringop-truncation.
>
> Does gcc10 warn after these changes? 

Gcc-10 doesn't warn about these changes.

I'm working on a new patch that to make both gcc-8 and gcc-10 happy.

Thanks,
Eric



More information about the net-dev mailing list