On Fri, Dec 2, 2016 at 7:22 AM, Yuri Gribov <tetra2...@gmail.com> wrote:
> On Fri, Dec 2, 2016 at 6:35 AM, Maxim Ostapenko <chefm...@gmail.com> wrote:
>> Hi,
>>
>> 02 Дек 2016 г. 7:30 пользователь "steven shi" <shijunj...@gmail.com>
>> написал:
>>>
>>> Hello,
>>> With the experts' help in this community, I've enabled the Asan for global
>>> and stack buffer in my bare-mental platform firmware, thanks a lot.
>>> But I find the current Asan doesn't support to protect the structure inner
>>> elements, E.g. the global_array[11] in below code. Unfortunately, most of
>>> important data are defined through structure in my firmware, and if the Asan
>>> doesn't support to protect structure inner elements, most of my data memory
>>> access will not be protected by Asan. So, could we let Asan support
>>> structure inner elements?
>>>
>>> Well, I understand it is not safe to just instrument red-zone between
>>> structure inner elements like current Asan does on global variable.  We also
>>> need to handle the sizeof(), offsetof() macro, the alignment pragma, and
>>> maybe others. Could we extend Asan scope beyond IR to Clang front-end to do
>>> some source-to-source conversion to handle these issue? E.g. for no
>>> alignment enforced structure,  replace the structure inner elements with
>>> red-zone instrumented version, and let the sizeof() be-aware of the size
>>> change. Is it possible?
>>
>> Won't this break separate sanitization? E.g. if I have libfoo.so that has
>> struct Foo as part of its ABI and I want to test it with ASan, I'll need to
>> recompile not only libfoo.so, but all dependent libraries too to make sure
>> they caught up the changed layout of struct Foo. This sounds like a bad idea
>> for me.
>> Or maybe I've just missed something?
>
> I think Steven's code is self-contained so he does not care. Also note
> that you can get away without breaking ABI but just poisoning natural
> padding in structures. I guess the main problem with sanitizing
> structs is that they are often passed to "low-level"
> memcmp/memcpy/memset/etc. functions which would result in spurious
> errors.

Also in C you don't get type information as easily as with C++'s new
operator. Structs are allocated as untyped memory buffers via malloc
and then casted to appropriate type. Compiler will have to figure out
that newly allocated char*-pointer is meant to point to struct (which
is not always possible e.g. if malloc happens in a different function
in separate translation unit).

-I

-- 
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-sanitizer+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to