On Mon, Aug 18, 2014 at 1:05 PM, Yuri Gribov <tetra2...@gmail.com> wrote:
> On Fri, Aug 15, 2014 at 10:34 PM, Konstantin Serebryany
> <konstantin.s.serebry...@gmail.com> wrote:
>> If this is -O1 or higher,  then most (but not all) of your cases
>> *should* be optimized by the compiler before asan kicks in.
>
> You mean hoisting memory accesses from branches?
> Sure, the tests are simplified beyond all limits.
> On the other hand even basic aliasing constraints
> would obviously prevent optimization of pointer accesses
> (but not of Asan checks!).

Exactly. I am interested in full non-simplified tests where the
regular optimizer has no chances,
but asan- (tsan-, msan-) specific optimizer has.

>
>> (This may be different for GCC-asan because GCC-asan runs a bit too
>> early, AFAICT. Maybe this *is* the problem we need to fix).
>
> Thanks for mentioning this, I'll try to experiment
> with moving Asan pass across the compilation pipeline and
> report my findings.
>
>> I am mainly interested in cases where the general optimizer can not
>> possibly improve the code,
>> but asan opt can eliminate redundant checks.
>
> As I mentined, I believe that aliasing may often restrict
> optimizer's code hoisting ability.
> And we certainly need Asan opt for combining checks.
>
>>> I already have a bunch of tests (which I plan to extend further). How
>>> should I submit them s.t. they could be reused by LLVM?
>>
>> Maybe just start accumulating tests on the CompileTimeOptimizations wiki
>> (as full functions that one can copy-paste to a .c file and build)?
>> Once some new optimization is implemented in a compiler X,
>> we'll copy the test with proper harness code (FileCheck/dejagnu/etc)
>> to the X's repository
>
> Ok, so I'll firstly post tests on wiki and explicitely reference their
> origin when submitting patches.
>
>>> Perhaps there is some prior work on verification of Java
>>> range checks optimizers?
>>
>> There is ton of work for range check optimizers,
>> but none of that
>> fully applies to asan,
>> since asan also checks use-after-free and init-order-fiasco.
>
> Could you give more details? How would
> use-after-free/init-order-fiasco influence verification of redundant
> elimination?


Consider this:

extern void foo(int *);
int *a = new int [10];
foo(a);
... = a[5];

here, a[5] can not go out of bounds and regular Java-oriented
algorithms will mark this as safe.
However, foo() may delete 'a' and we'll have a use-after-free here.

--kcc

Reply via email to