From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 26614 invoked by alias); 6 Jan 2014 11:16:03 -0000 Mailing-List: contact gcc-help-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-help-owner@gcc.gnu.org Received: (qmail 26602 invoked by uid 89); 6 Jan 2014 11:16:02 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.3 required=5.0 tests=AWL,BAYES_00,RP_MATCHES_RCVD autolearn=ham version=3.3.2 X-HELO: mail.hofr.at Received: from hofr.at (HELO mail.hofr.at) (212.69.189.236) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 06 Jan 2014 11:16:00 +0000 Received: by mail.hofr.at (Postfix, from userid 1002) id 1DDD74F8AFF; Mon, 6 Jan 2014 12:15:57 +0100 (CET) Date: Mon, 06 Jan 2014 11:16:00 -0000 From: Nicholas Mc Guire To: gcc-help@gcc.gnu.org Subject: build warning question - gcc 4.4.5 Message-ID: <20140106111557.GA30512@opentech.at> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.18 (2008-05-17) X-IsSubscribed: yes X-SW-Source: 2014-01/txt/msg00010.txt.bz2 HI ! during Linux kernel build I got the following build warning kernel/trace/trace.c: In function 'tracing_mark_write': kernel/trace/trace.c:3818: warning: 'page2' may be used uninitialized in this function after looking at this function I was not able to figure out how this uninitialized usage could happen - all access to page2 is "protected" by an "if (nr_pages == 2)" so no uninitialized access should be possible. is there some way to make gcc happy here ? full ref and code as well as gcc specs below. thx! hofrat linux-stable v3.4.75 kernel/trace/trace.c static ssize_t tracing_mark_write(struct file *filp, const char __user *ubuf, size_t cnt, loff_t *fpos) { unsigned long addr = (unsigned long)ubuf; struct ring_buffer_event *event; struct ring_buffer *buffer; struct print_entry *entry; unsigned long irq_flags; struct page *pages[2]; int nr_pages = 1; ssize_t written; void *page1; void *page2; int offset; int size; int len; int ret; if (tracing_disabled) return -EINVAL; if (cnt > TRACE_BUF_SIZE) cnt = TRACE_BUF_SIZE; /* * Userspace is injecting traces into the kernel trace buffer. * We want to be as non intrusive as possible. * To do so, we do not want to allocate any special buffers * or take any locks, but instead write the userspace data * straight into the ring buffer. * * First we need to pin the userspace buffer into memory, * which, most likely it is, because it just referenced it. * But there's no guarantee that it is. By using get_user_pages_fast() * and kmap_atomic/kunmap_atomic() we can get access to the * pages directly. We then write the data directly into the * ring buffer. */ BUILD_BUG_ON(TRACE_BUF_SIZE >= PAGE_SIZE); /* check if we cross pages */ if ((addr & PAGE_MASK) != ((addr + cnt) & PAGE_MASK)) nr_pages = 2; offset = addr & (PAGE_SIZE - 1); addr &= PAGE_MASK; ret = get_user_pages_fast(addr, nr_pages, 0, pages); if (ret < nr_pages) { while (--ret >= 0) put_page(pages[ret]); written = -EFAULT; goto out; } page1 = kmap_atomic(pages[0]); if (nr_pages == 2) page2 = kmap_atomic(pages[1]); local_save_flags(irq_flags); size = sizeof(*entry) + cnt + 2; /* possible \n added */ buffer = global_trace.buffer; event = trace_buffer_lock_reserve(buffer, TRACE_PRINT, size, irq_flags, preempt_count()); if (!event) { /* Ring buffer disabled, return as if not open for write */ written = -EBADF; goto out_unlock; } entry = ring_buffer_event_data(event); entry->ip = _THIS_IP_; if (nr_pages == 2) { len = PAGE_SIZE - offset; memcpy(&entry->buf, page1 + offset, len); memcpy(&entry->buf[len], page2, cnt - len); } else memcpy(&entry->buf, page1 + offset, cnt); if (entry->buf[cnt - 1] != '\n') { entry->buf[cnt] = '\n'; entry->buf[cnt + 1] = '\0'; } else entry->buf[cnt] = '\0'; ring_buffer_unlock_commit(buffer, event); written = cnt; *fpos += written; out_unlock: if (nr_pages == 2) kunmap_atomic(page2); kunmap_atomic(page1); while (nr_pages > 0) put_page(pages[--nr_pages]); out: return written; } Arch: x86_64 OS: Debian 6.0.6 GCC: default debian 6.0.6 gcc Using built-in specs. Target: x86_64-linux-gnu Configured with: ../src/configure -v --with-pkgversion='Debian 4.4.5-8' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.4 --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --libdir=/usr/lib --enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --with-arch-32=i586 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu Thread model: posix gcc version 4.4.5 (Debian 4.4.5-8)