https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89298

            Bug ID: 89298
           Summary: Address-Sanitizer false positive for
                    global-buffer-overflow?
           Product: gcc
           Version: 8.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: sanitizer
          Assignee: unassigned at gcc dot gnu.org
          Reporter: lee_shao at 126 dot com
                CC: dodji at gcc dot gnu.org, dvyukov at gcc dot gnu.org,
                    jakub at gcc dot gnu.org, kcc at gcc dot gnu.org, marxin at 
gcc dot gnu.org
  Target Milestone: ---

Hi,
In my program, the ASAN report ERROR global-buffer-overflow on several global
variables.

However,I'm sure that I use the global variables in the right way, like this:

  In AAA.c 
     //define a global var 
     int g_var_a;
     ........ 
     ........ 
     g_var_a =1; //ASAN report global-buffer-overflow right here!

According to the formula, Shadow = (Mem >> 3) + 0x20000000, the value of the
shadow memory of the global var **g_var_a** is F9 ( Global Redzone),witch
confuses me very much!

I use GCC8.1.0 to compile my project on SUSE Linux Enterprise Server 12.

The application is compiled like this:
1. A.c  +  B.c  -> GCC8.1 ASan ->  libproblem.so
2. C.c  +  libproblem.so  --> GCC8.1 ASan --> App
3. In A.c  :
   ... globals ...
   unsigned int g_var =0;
   ... globals ...
   In B.c :
   extern unsigned int g_var =0;
   ..........
   void fun(){
   .....
   g_var =0;       //ASan report global-buffer-overflow right here!
   .....
   }

I found that:
1. The global g_var is located 0 bytes to the right of another global
variable,that is , no redzone is inserted between them
2. Under normal circumstances, $ nm App > nm.log  we can get the addresses of
globals g_var and __odr_asan.g_var ;
   However, when it goes wrong, there is no symbol __odr_asan.g_var

Reply via email to