On Mon, Jan 26, 2015 at 01:23:05PM +0300, Dan Carpenter wrote: > On Mon, Jan 26, 2015 at 01:01:19PM +0300, Vladimir Davydov wrote: > > This warning is false-positive, because @old equals NULL iff > > @memcg_nr_cache_ids equals 0. > > I don't see how it could be a false positive. The "old" pointer is > dereferenced inside the call to memset() so unless memset is a macro the > compiler isn't going to optimize the dereference away. old->entries is not dereferenced: memcg_cache_array->entries is not a pointer - it is embedded to the memcg_cache_array struct. > > > //----- test code > > void frob(void *p){} > > struct foo { > int *x, *y, *z; > }; > > int main(void) > { > struct foo *x = NULL; > > frob(x->y); > > return 0; > } > > //---- end > > > If we compile with gcc test.c then it segfaults. With -02 the compiler > is able to tell that frob() is an empty function and it doesn't > segfault. In the kernel code, there is no way for the compiler to > optimize the memset() away so it will Oops. Just change - int *x, *y, *z; + int *x, *z; + int *y[0]; and it won't. Thanks, Vladimir -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>