On 07/05/2018 12:01 PM, Jakub Jelinek wrote: > On Wed, Jul 04, 2018 at 08:20:47PM +0300, Maxim Ostapenko wrote: >> On 07/04/2018 05:45 AM, Jeff Law wrote: >>> On 05/23/2018 11:15 AM, Maxim Ostapenko wrote: >>>> as described in PR, when using both ASan and UBSan >>>> (-fsanitize=address,undefined ), we have symbols collision for global >>>> functions, like __sanitizer_set_report_path. This leads to fuzzy results >>>> when printing reports into files e.g. for this test case: >>>> >>>> #include <sanitizer/common_interface_defs.h> >>>> int main(int argc, char **argv) { >>>> __sanitizer_set_report_path("/tmp/sanitizer.txt"); >>>> int i = 23; >>>> i <<= 32; >>>> int *array = new int[100]; >>>> delete [] array; >>>> return array[argc]; >>>> } >>>> >>>> only ASan's report gets written to file; UBSan output goes to stderr. >>>> >>>> To resolve this issue we could use two approaches: >>>> >>>> 1) Use the same approach to that is implemented in Clang (UBSan embedded >>>> to ASan). The only caveat here is that we need to link (unused) C++ part >>>> of UBSan even in C programs when linking static ASan runtime. This >>>> happens because GCC, as opposed to Clang, doesn't split C and C++ >>>> runtimes for sanitizers. >>>> >>>> 2) Just add SANITIZER_INTERFACE_ATTRIBUTE to report_file global >>>> variable. In this case all __sanitizer_set_report_path calls will set >>>> the same report_file variable. IMHO this is a hacky way to fix the >>>> issue, it's better to use the first option if possible. >>>> >>>> >>>> The attached patch fixes the symbols collision by embedding UBSan into >>>> ASan (variant 1), just like we do for LSan. >>>> >>>> >>>> Regtested/bootstrapped on x86_64-unknown-linux-gnu, looks reasonable >>>> enough for trunk? >>>> >>>> >>>> -Maxim >>>> >>>> >>>> pr84250-2.diff >>>> >>>> >>>> gcc/ChangeLog: >>>> >>>> 2018-05-23 Maxim Ostapenko <m.ostape...@samsung.com> >>>> >>>> * config/gnu-user.h (LIBASAN_EARLY_SPEC): Pass -lstdc++ for static >>>> libasan. >>>> * gcc.c: Do not pass LIBUBSAN_SPEC if ASan is enabled with UBSan. >>>> >>>> libsanitizer/ChangeLog: >>>> >>>> 2018-05-23 Maxim Ostapenko <m.ostape...@samsung.com> >>>> >>>> * Makefile.am: Reorder libs. >>>> * Makefile.in: Regenerate. >>>> * asan/Makefile.am: Define DCAN_SANITIZE_UB=1, add dependancy from >>>> libsanitizer_ubsan.la. >>>> * asan/Makefile.in: Regenerate. >>>> * ubsan/Makefile.am: Define new libsanitizer_ubsan.la library. >>>> * ubsan/Makefile.in: Regenerate. >>> You know this code better than anyone else working on GCC. My only >>> concern would be the kernel builds with asan, but I suspect they're >>> providing their own runtime anyway, so the libstdc++ caveat shouldn't apply. >> Yes, you are right, kernel provides its own runtime. >> >>> OK for the trunk. >> Ok, thanks, I'll apply the patch today (with fixed ChangeLog entry). > This broke the c-c++-common/asan/pr59063-2.c test: > > FAIL: c-c++-common/asan/pr59063-2.c -O1 (test for excess errors) > Excess errors: > /usr/bin/ld: cannot find -lstdc++
I must mis-looked this, sorry :(. > While it could be fixed by tweaking asan-dg.exp, thinking about this, the > 1) variant is actually not a good idea, it will not work properly anyway > if you link one library with -fsanitize=undefined and another library > with -fsanitize=address, the right solution is to make the two libraries > coexist sanely Yes, you're right. Btw, we have pretty the same situation with ASan + LSan, right? > , so I'd prefer 2) or if not exporting a variable, export > an accessor function to get the address of the variable (or whole block of > shared state in one object between the libraries). > > Yes, it means trying to get something accepted upstream, but anything else > is an ugly hack. Ok. Could you please revert this patch for me (I don't have a write access to repo right now) so we can cook a proper fix? -Maxim > > Jakub > > >