I started review process in libsanitizer: https://reviews.llvm.org/D26965
And I have a question that was asked in the review: can we distinguish between 
load and store
in case of having usage of ASAN_POISON?

Load looks as follows:

int
main (int argc, char **argv)
{
  char *ptr;

  if (argc != 12312)
  {
    char my_char;
    ptr = &my_char;
  }

  return *ptr;
}

main (int argc, char * * argv)
{
  char my_char;
  int _5;

  <bb 2>:
  if (argc_1(D) != 12312)
    goto <bb 3>;
  else
    goto <bb 5>;

  <bb 5>:
  goto <bb 4>;

  <bb 3>:
  my_char_8 = ASAN_POISON ();

  <bb 4>:
  # my_char_6 = PHI <my_char_7(D)(5), my_char_8(3)>
  _5 = (int) my_char_6;
  return _5;

}

however doing a store:
int
main (int argc, char **argv)
{
  char *ptr;

  if (argc != 12312)
  {
    char my_char;
    ptr = &my_char;
  }

  *ptr = 0;
  return 0;
}

main (int argc, char * * argv)
{
  <bb 2>:
  if (argc_1(D) != 12312)
    goto <bb 3>;
  else
    goto <bb 5>;

  <bb 5>:
  goto <bb 4>;

  <bb 3>:
  ASAN_POISON ();

  <bb 4>:
  return 0;

}

leads to a situation, where LHS of ASAN_POISON assignment is identified as 
overwritten and eventually
we see just ASAN_POISON call. This is currently removed in sanopt pass, but I'm 
wondering whether it's
valid optimization or not in this context?

Thanks,
Martin

Reply via email to