diff --git a/modules/compiler_vm/languages/c11.pm b/modules/compiler_vm/languages/c11.pm index 0a89a0a8..6792493f 100755 --- a/modules/compiler_vm/languages/c11.pm +++ b/modules/compiler_vm/languages/c11.pm @@ -14,7 +14,7 @@ sub initialize { $self->{sourcefile} = 'prog.c'; $self->{execfile} = 'prog'; - $self->{default_options} = '-Wextra -Wall -Wno-unused -pedantic -Wfloat-equal -Wshadow -std=c11 -lm -Wfatal-errors -fsanitize=alignment,undefined'; + $self->{default_options} = '-Wextra -Wall -Wno-unused -pedantic -Wfloat-equal -Wshadow -std=c11 -lm -Wfatal-errors -fsanitize=alignment,undefined -fsanitize-address-use-after-scope -fno-omit-frame-pointer'; $self->{options_paste} = '-fdiagnostics-show-caret'; $self->{options_nopaste} = '-fno-diagnostics-show-caret'; $self->{cmdline} = 'gcc -ggdb -g3 $sourcefile $options -o $execfile'; diff --git a/modules/compiler_vm/languages/server/_c_base.pm b/modules/compiler_vm/languages/server/_c_base.pm index f471a2e7..c1c55549 100755 --- a/modules/compiler_vm/languages/server/_c_base.pm +++ b/modules/compiler_vm/languages/server/_c_base.pm @@ -79,7 +79,15 @@ sub postprocess { print "Executing gdb\n"; my @args = $self->split_line($self->{arguments}, strip_quotes => 1, preserve_escapes => 0); - my ($exitval, $stdout, $stderr) = $self->execute(60, undef, 'compiler_watchdog.pl', @args); + my ($exitval, $stdout, $stderr); + + if ($self->{cmdline} =~ /-fsanitize=(?:[^ ]+,)?address/) { + # leak sanitizer doesn't work under ptrace/gdb + # ASAN_OPTIONS=strict_string_checks=1:detect_stack_use_after_return=1:check_initialization_order=1:strict_init_order=1 + ($exitval, $stdout, $stderr) = $self->execute(60, undef, './prog', @args); + } else { + ($exitval, $stdout, $stderr) = $self->execute(60, undef, 'compiler_watchdog.pl', @args); + } my $result = $stderr; $result .= ' ' if length $result;