question about segmentation fault error from address-sanitizer report

499 views
Skip to first unread message

laser

unread,
Jan 15, 2014, 10:14:15 PM1/15/14
to address-...@googlegroups.com
Hi experts,

asan report segment fault error for memset line in the simple code below, valgrind doesn't report it, could you explain the reason?


  1 #include <signal.h>
  2 #include <stdio.h>
  3 #include <stdlib.h>
  4 #include <string.h>
  5
  6
  7 int main(void)
  8 {
  9     struct sigaction sa;
 10
 11     memset(&sa, 0, sizeof(sigaction));
 12     sigemptyset(&sa.sa_mask);
 13    // sa.sa_flags  = SA_SIGINFO;
 14
 15    // sigaction(SIGSEGV, &sa, NULL);
 16
 17     return 0;
 18 }





root@terry-lx:/tmp# ./segerror1

ASAN:SIGSEGV

=================================================================

==26565== ERROR: AddressSanitizer: SEGV on unknown address 0x17f91a12 (pc 0x0804868b sp 0xbfc8d060 bp 0xbfc8d158 T0)

AddressSanitizer can not provide additional info.

    #0 0x804868a (/tmp/segerror1+0x804868a)

    #1 0xb5fda4d2 (/lib/i386-linux-gnu/libc-2.15.so+0x194d2)

    #2 0x8048510 (/tmp/segerror1+0x8048510)

==26565== ABORTING

root@test-lx:/tmp# ./segerror1 2>&1 | ./asan_symbolize.py | c++filt

/tmp/llvm-3.4/llvm/Release+Asserts/bin/llvm-symbolizer --use-symbol-table=true --demangle=False --functions=true --inlining=true

ASAN:SIGSEGV

=================================================================

==26566== ERROR: AddressSanitizer: SEGV on unknown address 0x17ff0c3a (pc 0x0804868b sp 0xbff861a0 bp 0xbff86298 T0)

AddressSanitizer can not provide additional info.

    #0 0x804868a (/tmp/segerror1+0x804868a)


/tmp/segerror1 0x804868a

    #0 0x804868a in main /tmp/./segerror1.c:11:0

    #1 0xb60184d2 (/lib/i386-linux-gnu/libc-2.15.so+0x194d2)


/lib/i386-linux-gnu/libc-2.15.so 0x194d2

addr2line -f -e /lib/i386-linux-gnu/libc-2.15.so

/lib/i386-linux-gnu/libc-2.15.so 0x194d2

    #1 0xb60184d2 in __libc_start_main /build/buildd/eglibc-2.15/csu/libc-start.c:226

    #2 0x8048510 (/tmp/segerror1+0x8048510)


/tmp/segerror1 0x8048510

addr2line -f -e /tmp/segerror1

/tmp/segerror1 0x8048510

    #2 0x8048510 in _start ??:0

==26566== ABORTING


Konstantin Serebryany

unread,
Jan 15, 2014, 10:30:33 PM1/15/14
to address-...@googlegroups.com
This does not happen for me:

% cat z.c
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main(void)
{
struct sigaction sa;

memset(&sa, 0, sizeof(sigaction));
sigemptyset(&sa.sa_mask);
// sa.sa_flags = SA_SIGINFO;

// sigaction(SIGSEGV, &sa, NULL);

return 0;
}
% clang z.c -fsanitize=address && ./a.out
%


Please provide more info. How do you compile? (make sure to add -g)
run this under gdb and show what 'bt' says.

--kcc
> --
> You received this message because you are subscribed to the Google Groups
> "address-sanitizer" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to address-saniti...@googlegroups.com.
> For more options, visit https://groups.google.com/groups/opt_out.

Dmitry Vyukov

unread,
Jan 15, 2014, 10:34:25 PM1/15/14
to address-sanitizer
On Thu, Jan 16, 2014 at 7:14 AM, laser <sjzw...@gmail.com> wrote:
> Hi experts,
>
> asan report segment fault error for memset line in the simple code below,
> valgrind doesn't report it, could you explain the reason?
>
>
> 1 #include <signal.h>
> 2 #include <stdio.h>
> 3 #include <stdlib.h>
> 4 #include <string.h>
> 5
> 6
> 7 int main(void)
> 8 {
> 9 struct sigaction sa;
> 10
> 11 memset(&sa, 0, sizeof(sigaction));


try memset(&sa, 0, sizeof(sa));
sigaction may be referring to the function

laser

unread,
Jan 15, 2014, 11:36:46 PM1/15/14
to address-...@googlegroups.com
-g was added, The Compile info and gdb is below.  thanks!
 
<gcc4.8 path>/i686-linux5.0-gcc -fsanitize=address -g -Wl,-rpath=<libasan path>/lib -o segerror1 ./segerror1.c


(gdb) run
Starting program: /tmp/./segerror1
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/i386-linux-gnu/libthread_db.so.1".

Program received signal SIGSEGV, Segmentation fault.
0x0804868b in main () at ./segerror1.c:11
11          memset(&sa, 0, sizeof(sigaction));
(gdb) bt
#0  0x0804868b in main () at ./segerror1.c:11
(gdb) bt full
#0  0x0804868b in main () at ./segerror1.c:11
        sa = {__sigaction_handler = {sa_handler = 0xbffff588, sa_sigaction = 0xbffff588}, sa_mask = {__val = {3087006324, 0, 3062103960, 1, 0, 1, 3087005976, 3061966280, 3061966288,
              3221222824, 3064042993, 3063833572, 3061050508, 3221222824, 3061014528, 3061094460, 3062313366, 0, 3064042993, 3221222916, 3061966280, 3064000985, 134518996, 134514512,
              0, 3221222776, 134514484, 3064105672, 3064104756, 3221222792, 134514653, 134514512}}, sa_flags = 134519256, sa_restorer = 0xbffff598}

Konstantin Serebryany

unread,
Jan 16, 2014, 12:10:44 AM1/16/14
to address-...@googlegroups.com
What happens if you follow Dmitry's suggestion?
sizeof(sigaction) is most likely not what you need.
Reply all
Reply to author
Forward
0 new messages