Example #1
0
bool taint_parser(
  const std::string &file_name,
  taint_parse_treet &dest,
  message_handlert &message_handler)
{
  jsont json;

  if(parse_json(file_name, message_handler, json))
  {
    messaget message(message_handler);
    message.error() << "taint file is not a valid json file"
                    << messaget::eom;
    return true;
  }

  if(!json.is_array())
  {
    messaget message(message_handler);
    message.error() << "expecting an array in the taint file, but got "
                    << json << messaget::eom;
    return true;
  }
  
  for(jsont::arrayt::const_iterator
      it=json.array.begin();
      it!=json.array.end();
      it++)
  {
    if(!it->is_object())
    {
      messaget message(message_handler);
      message.error() << "expecting an array of objects in the taint file, but got "
                      << *it << messaget::eom;
      return true;
    }
    
    taint_parse_treet::entryt entry;
    
    const std::string kind=(*it)["kind"].value;
    const std::string function=(*it)["function"].value;
    const std::string where=(*it)["where"].value;
    const std::string taint=(*it)["taint"].value;
    const std::string message=(*it)["message"].value;
    
    if(kind=="source")
      entry.kind=taint_parse_treet::entryt::SOURCE;
    else if(kind=="sink")
      entry.kind=taint_parse_treet::entryt::SINK;
    else if(kind=="sanitizer")
      entry.kind=taint_parse_treet::entryt::SANITIZER;
    else
    {
      messaget message(message_handler);
      message.error() << "taint entry must have \"kind\" which is "
                         "\"source\" or \"sink\" or \"sanitizer\""
                      << messaget::eom;
      return true;
    }
    
    if(function.empty())
    {
      messaget message(message_handler);
      message.error() << "taint entry must have \"function\""
                      << messaget::eom;
      return true;
    }
    else
      entry.function_identifier=function;

    if(where=="return_value")
    {
      entry.where=taint_parse_treet::entryt::RETURN_VALUE;
    }
    else if(where=="this")
    {
      entry.where=taint_parse_treet::entryt::THIS;
    }
    else if(std::string(where, 0, 9)=="parameter")
    {
      entry.where=taint_parse_treet::entryt::PARAMETER;
      entry.parameter_number=
        safe_string2unsigned(std::string(where, 9, std::string::npos));
    }
    else
    {
      messaget message(message_handler);
      message.error() << "taint entry must have \"where\""
                      << " which is \"return_value\" or \"this\" or \"parameter1\"..."
                      << messaget::eom;
      return true;
    }
    
    entry.taint=taint;
    entry.message=message;
    
    dest.entries.push_back(entry);
  }
  
  return false;
}