http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57856
Bug ID: 57856 Summary: for an uninitialized variable, gcc assumes it already has value instead of report uninitialized warnings. Product: gcc Version: 4.9.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: gang.chen at asianux dot com Created attachment 30477 --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=30477&action=edit Related disassemble code. For Linux kernel source code "mm/vmscan.c", function putback_lru_page(), version is next-20130621. Gcc assumes "lru == LRU_UNEVICTABLE" instead of report warnings (uninitializing lru). I got gcc source code from svn, "configure && make && make install". [root@gchenlinux linux-next]# which gcc /usr/local/bin/gcc [root@gchenlinux linux-next]# gcc -v Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/local/libexec/gcc/x86_64-unknown-linux-gnu/4.9.0/lto-wrapper Target: x86_64-unknown-linux-gnu Configured with: ./configure Thread model: posix gcc version 4.9.0 20130704 (experimental) (GCC) The related source code: 580 void putback_lru_page(struct page *page) 581 { 582 int lru; 583 int was_unevictable = PageUnevictable(page); 584 585 VM_BUG_ON(PageLRU(page)); 586 587 redo: 588 ClearPageUnevictable(page); 589 590 if (page_evictable(page)) { 591 /* 592 * For evictable pages, we can use the cache. 593 * In event of a race, worst case is we end up with an 594 * unevictable page on [in]active list. 595 * We know how to handle that. 596 */ 597 lru_cache_add(page); 598 } else { 599 /* 600 * Put unevictable pages directly on zone's unevictable 601 * list. 602 */ 603 lru = LRU_UNEVICTABLE; 604 add_page_to_unevictable_list(page); 605 /* 606 * When racing with an mlock or AS_UNEVICTABLE clearing 607 * (page is unlocked) make sure that if the other thread 608 * does not observe our setting of PG_lru and fails 609 * isolation/check_move_unevictable_pages, 610 * we see PG_mlocked/AS_UNEVICTABLE cleared below and move 611 * the page back to the evictable list. 612 * 613 * The other side is TestClearPageMlocked() or shmem_lock(). 614 */ 615 smp_mb(); 616 } 617 618 /* 619 * page's status can change while we move it among lru. If an evictable 620 * page is on unevictable list, it never be freed. To avoid that, 621 * check after we added it to the list, again. 622 */ 623 if (lru == LRU_UNEVICTABLE && page_evictable(page)) { 624 if (!isolate_lru_page(page)) { 625 put_page(page); 626 goto redo; 627 } 628 /* This means someone else dropped this page from LRU 629 * So, it will be freed or putback to LRU again. There is 630 * nothing to do here. 631 */ 632 } 633 634 if (was_unevictable && lru != LRU_UNEVICTABLE) 635 count_vm_event(UNEVICTABLE_PGRESCUED); 636 else if (!was_unevictable && lru == LRU_UNEVICTABLE) 637 count_vm_event(UNEVICTABLE_PGCULLED); 638 639 put_page(page); /* drop ref from isolate */ 640 } /* * Related disassemble code: * make defconfig under x86_64 PC. * make menuconfig (choose "Automount devtmpfs at /dev..." and KGDB) * make V=1 EXTRA_CFLAGS=-W (not find related warnings, ref warn.log in attachment) * objdump -d vmlinux > vmlinux.S * vi vmlinux.S * * The issue is: compiler assumes "lru == LRU_UNEVICTABLE" instead of report warnings (uninitializing lru) */ ffffffff810f3d20 <putback_lru_page>: ffffffff810f3d20: 55 push %rbp ffffffff810f3d21: 48 89 e5 mov %rsp,%rbp ffffffff810f3d24: 41 55 push %r13 ffffffff810f3d26: 41 54 push %r12 ffffffff810f3d28: 4c 8d 67 02 lea 0x2(%rdi),%r12 ; for ClearPageUnevictable(page); ffffffff810f3d2c: 53 push %rbx ffffffff810f3d2d: 4c 8b 2f mov (%rdi),%r13 ; was_unevictable = PageUnevictable(page); ffffffff810f3d30: 48 89 fb mov %rdi,%rbx ffffffff810f3d33: 49 c1 ed 14 shr $0x14,%r13 ffffffff810f3d37: 41 83 e5 01 and $0x1,%r13d ffffffff810f3d3b: eb 28 jmp ffffffff810f3d65 <putback_lru_page+0x45> ffffffff810f3d3d: 0f 1f 00 nopl (%rax) /* if(page_evictable(page)) { */ ffffffff810f3d40: e8 db c7 ff ff callq ffffffff810f0520 <lru_cache_add> /* } */ /* if (lru == LRU_UNEVICTABLE && page_evictable(page)) { */ ; assmue lru == LRU_UNEVICTABLE ffffffff810f3d45: 48 89 df mov %rbx,%rdi ffffffff810f3d48: e8 a3 ff ff ff callq ffffffff810f3cf0 <page_evictable> ffffffff810f3d4d: 85 c0 test %eax,%eax ffffffff810f3d4f: 74 3d je ffffffff810f3d8e <putback_lru_page+0x6e> ffffffff810f3d51: 48 89 df mov %rbx,%rdi ffffffff810f3d54: e8 87 fb ff ff callq ffffffff810f38e0 <isolate_lru_page> ffffffff810f3d59: 85 c0 test %eax,%eax ffffffff810f3d5b: 75 31 jne ffffffff810f3d8e <putback_lru_page+0x6e> ffffffff810f3d5d: 48 89 df mov %rbx,%rdi ffffffff810f3d60: e8 3b c1 ff ff callq ffffffff810efea0 <put_page> /* redo: */ /* ClearPageUnevictable(page); */ ffffffff810f3d65: f0 41 80 24 24 ef lock andb $0xef,(%r12) /* if(page_evictable(page)) { */ ffffffff810f3d6b: 48 89 df mov %rbx,%rdi ffffffff810f3d6e: e8 7d ff ff ff callq ffffffff810f3cf0 <page_evictable> ffffffff810f3d73: 85 c0 test %eax,%eax ffffffff810f3d75: 48 89 df mov %rbx,%rdi ffffffff810f3d78: 75 c6 jne ffffffff810f3d40 <putback_lru_page+0x20> /* else { */ ; assume lru == LRU_UNEVICTABLE ffffffff810f3d7a: e8 c1 c7 ff ff callq ffffffff810f0540 <add_page_to_unevictable_list> ffffffff810f3d7f: 0f ae f0 mfence /* } */ /* if (lru == LRU_UNEVICTABLE && page_evictable(page)) { */ ; assmue lru == LRU_UNEVICTABLE ffffffff810f3d82: 48 89 df mov %rbx,%rdi ffffffff810f3d85: e8 66 ff ff ff callq ffffffff810f3cf0 <page_evictable> ffffffff810f3d8a: 85 c0 test %eax,%eax ffffffff810f3d8c: 75 c3 jne ffffffff810f3d51 <putback_lru_page+0x31> /* } */ /* if (was_unevictable && lru != LRU_UNEVICTABLE) */ /* ... */ /* else if (!was_unevictable && lru == LRU_UNEVICTABLE) */ ffffffff810f3d8e: 4d 85 ed test %r13,%r13 ; !was_unevictable, assmue lru == LRU_UNEVICTABLE ffffffff810f3d91: 75 09 jne ffffffff810f3d9c <putback_lru_page+0x7c> ffffffff810f3d93: 65 48 ff 04 25 68 f0 incq %gs:0xf068 ; count_vm_event(UNEVICTABLE_PGCULLED); ; "incq %gs:0xf078" for count_vm_event(UNEVICTABLE_PGRESCUED); ffffffff810f3d9a: 00 00 /* put_page() */ ffffffff810f3d9c: 48 89 df mov %rbx,%rdi ffffffff810f3d9f: e8 fc c0 ff ff callq ffffffff810efea0 <put_page> ffffffff810f3da4: 5b pop %rbx ffffffff810f3da5: 41 5c pop %r12 ffffffff810f3da7: 41 5d pop %r13 ffffffff810f3da9: 5d pop %rbp ffffffff810f3daa: c3 retq ffffffff810f3dab: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1) ffffffff81dc4d8a: c3 retq