On 6/14/20 4:15 PM, Shuai Wang via Gcc wrote:
Hello,

I am writing to inquire the procedure (or any tutorial) to write plugins
for the `sanopt` pass. Basically I am doing some analysis of ASan/UBSan
checks. I use the following command to dump all passes in IR format:

gcc -fdump-tree-all -fsanitize=address test.c

To me, I think the following two outputs:

test.c.228t.asan0
test.c.230t.sanopt

Seems both useful. I am relatively familiar with GIMPLE plugins; however, I
note that in the GIMPLE code (e.g., test.c.005t.gimple), I just cannot
find the corresponding ASAN check function calls, like .ASAN_CHECK.

Hello.

Can you please show how you iterate GIMPLE statements in basic blocks?
You should find them with:

gcall *call = dyn_cast <const gcall *> (stmt)
if (call)
  internal_fn fn = gimple_call_internal_fn (call);
  if (fn == IFN_ASAN_CHECK)
    ...


Therefore, it seems that I cannot do GIMPLE-level plugin, although that
seems easy for my tasks.

Basically I will need to pinpoint either (in test.c.228t.asan0):

   <bb 2> :
   .ASAN_MARK (UNPOISON, &stack_array, 400);
   _10 = &stack_array[1];
  * .ASAN_CHECK (7, _10, 4, 4); <--------------*
   stack_array[1] = 100;
   _1 = argc_5(D) + 12;
   _11 = &stack_array[_1];
*  .ASAN_CHECK (6, _11, 4, 4);  <--------------*
   c_6 = stack_array[_1];

Or (in test.c.230t.sanopt):

   _20 = _14 & 7;
   _21 = (signed char) _20;
   _22 = _21 + 3;
   _23 = _22 >= _18;
   _24 = _19 & _23;
   if (_24 != 0)
     goto <bb 5>; [0.05%]
   else
     goto <bb 4>; [99.95%]

   <bb 5> :
*  __builtin___asan_report_store4 (_14); <-----------------*


Could anyone shed some lights on how to write analysis passes/plugins for
the outputs of either `sanopt` or `asan0`; I would prefer `sanopt` but any
suggestion would be appreciated. Thank you very much.

I would prefer modifying asan0 output rather then sanopt. What exactly do you
want to change?

Martin


Best,
Shuai


Reply via email to