GCC Middle and Back End API Reference
sarif_location_manager Class Reference
Inheritance diagram for sarif_location_manager:
Collaboration diagram for sarif_location_manager:

Data Structures

struct  worklist_item
 

Public Member Functions

 sarif_location_manager ()
 
unsigned allocate_location_id ()
 
virtual void add_related_location (std::unique_ptr< sarif_location > location_obj, sarif_builder &builder)
 
void add_relationship_to_worklist (sarif_location &location_obj, enum worklist_item::kind kind, location_t where)
 
void process_worklist (sarif_builder &builder)
 
void process_worklist_item (sarif_builder &builder, const worklist_item &item)
 
sarif_property_bagget_or_create_properties ()
 
enum kind get_kind () const final override
 
void print (pretty_printer *pp, bool formatted) const final override
 
bool is_empty () const
 
void set (const char *key, value *v)
 
template<typename JsonType>
void set (const char *key, std::unique_ptr< JsonType > v)
 
valueget (const char *key) const
 
void set_string (const char *key, const char *utf8_value)
 
void set_integer (const char *key, long v)
 
void set_float (const char *key, double v)
 
void set_bool (const char *key, bool v)
 
void dump (FILE *, bool formatted) const
 
void DEBUG_FUNCTION dump () const
 

Private Types

typedef hash_map< char *, value *, simple_hashmap_traits< nofree_string_hash, value * > > map_t
 

Private Attributes

json::arraym_related_locations_arr
 
unsigned m_next_location_id
 
std::list< worklist_itemm_worklist
 
std::map< location_t, sarif_location * > m_included_from_locations
 
std::map< location_t, sarif_location * > m_unlabelled_secondary_locations
 
map_t m_map
 
auto_vec< const char * > m_keys
 

Detailed Description

A class for sarif_objects that own a "namespace" of numeric IDs for managing location objects within them. Currently (SARIF v2.1.0) this is just for sarif_result (section 3.28.2), but it will likely eventually also be for notification objects; see https://github.com/oasis-tcs/sarif-spec/issues/540 Consider locations with chains of include information e.g. > include-chain-1.c: > #include "include-chain-1.h" include-chain-1.h: | // First set of decls, which will be referenced in notes | #include "include-chain-1-1.h" | | // Second set of decls, which will trigger the errors | #include "include-chain-1-2.h" include-chain-1-1.h: | int p; | int q; include-chain-1-1.h: | char p; | char q; GCC's textual output emits: | In file included from PATH/include-chain-1.h:5, | from PATH/include-chain-1.c:30: | PATH/include-chain-1-2.h:1:6: error: conflicting types for 'p'; have 'char' | 1 | char p; | | ^ | In file included from PATH/include-chain-1.h:2: | PATH/include-chain-1-1.h:1:5: note: previous declaration of 'p' with type 'int' | 1 | int p; | | ^ | PATH/include-chain-1-2.h:2:6: error: conflicting types for 'q'; have 'char' | 2 | char q; | | ^ | PATH/include-chain-1-1.h:2:5: note: previous declaration of 'q' with type 'int' | 2 | int q; | | ^ Whenever a SARIF location is added for a location_t that was #included from somewhere, we queue up the creation of a SARIF location for the location of the #include. The worklist of queued locations is flushed when the result is finished, which lazily creates any additional related locations for the include chain, and the relationships between the locations. Doing so can lead to further include locations being processed. The worklist approach allows us to lazily explore the relevant part of the directed graph of location_t values implicit in our line_maps structure, replicating it as a directed graph of SARIF locations within the SARIF result object, like this: [0]: error in include-chain-1-2.h ("conflicting types for 'p'; have 'char'") [1]: #include "include-chain-1-2.h" in include-chain-1.h [2]: note in include-chain-1-2.h ("previous declaration of 'p' with type 'int'") [3]: #include "include-chain-1-1.h" in include-chain-1.h [4]: #include "include-chain-1.h" in include-chain-1.c where we want to capture this "includes" graph in SARIF form: . +-----------------------------------+ +----------------------------------+ . |"id": 0 | |"id": 2 | . | error: "conflicting types for 'p';| | note: previous declaration of 'p'| . | have 'char'"| | | with type 'int'") | . | in include-chain-1-2.h | | in include-chain-1-1.h | . +-----------------------------------+ +----------------------------------+ . ^ | ^ | . includes | | included-by includes | | included-by . | V | V . +--------------------------------+ +--------------------------------+ . |"id": 1 | |"id": 3 | . | #include "include-chain-1-2.h" | | #include "include-chain-1-1.h" | . | in include-chain-1.h | | in include-chain-1.h | . +--------------------------------+ +--------------------------------+ . ^ | ^ | . includes | | included-by includes | | included-by . | V | V . +------------------------------------+ . |"id": 4 | . | The #include "include-chain-1.h" | . | in include-chain-1.c | . +------------------------------------+

Member Typedef Documentation

◆ map_t

typedef hash_map<char *, value *, simple_hashmap_traits<nofree_string_hash, value *> > json::object::map_t
privateinherited

Constructor & Destructor Documentation

◆ sarif_location_manager()

sarif_location_manager::sarif_location_manager ( )
inline

Member Function Documentation

◆ add_related_location()

void sarif_location_manager::add_related_location ( std::unique_ptr< sarif_location > location_obj,
sarif_builder & builder )
virtual
class sarif_location_manager : public sarif_object.
Base implementation of sarif_location_manager::add_related_location vfunc. Add LOCATION_OBJ to this object's "relatedLocations" array, creating it if it doesn't yet exist.

Reimplemented in sarif_ice_notification.

References m_related_locations_arr, and json::object::set().

Referenced by sarif_ice_notification::add_related_location(), sarif_result::on_diagram(), sarif_result::on_nested_diagnostic(), and process_worklist_item().

◆ add_relationship_to_worklist()

void sarif_location_manager::add_relationship_to_worklist ( sarif_location & location_obj,
enum worklist_item::kind kind,
location_t where )

◆ allocate_location_id()

unsigned sarif_location_manager::allocate_location_id ( )
inline

◆ dump() [1/2]

void value::dump ( ) const
inherited
A convenience function for debugging. Dump to stderr with formatting, and a trailing newline.

References dump().

Referenced by dump().

◆ dump() [2/2]

void value::dump ( FILE * outf,
bool formatted ) const
inherited
class json::value.
Dump this json::value tree to OUTF. The key/value pairs of json::objects are printed in the order in which the keys were originally inserted.

References output_buffer::m_stream, pp_buffer(), pp_flush(), and print().

Referenced by generate_results().

◆ get()

◆ get_kind()

enum kind json::object::get_kind ( ) const
inlinefinaloverridevirtualinherited

Implements json::value.

References final(), and json::JSON_OBJECT.

◆ get_or_create_properties()

sarif_property_bag & sarif_object::get_or_create_properties ( )
inherited

◆ is_empty()

bool json::object::is_empty ( ) const
inlineinherited

References m_map.

◆ print()

void object::print ( pretty_printer * pp,
bool formatted ) const
finaloverridevirtualinherited

◆ process_worklist()

void sarif_location_manager::process_worklist ( sarif_builder & builder)
Process all items in this result's worklist. Doing so may temporarily add new items to the end of the worklist. Handling any item should be "lazy", and thus we should eventually drain the queue and terminate.

References m_worklist, and process_worklist_item().

◆ process_worklist_item()

◆ set() [1/2]

template<typename JsonType>
void json::object::set ( const char * key,
std::unique_ptr< JsonType > v )
inlineinherited

References set().

◆ set() [2/2]

void object::set ( const char * key,
value * v )
inherited
Set the json::value * for KEY, taking ownership of V (and taking a copy of KEY if necessary).

References gcc_assert, m_keys, and m_map.

Referenced by optrecord_json_writer::add_pass_list(), optrecord_json_writer::add_record(), sarif_location_manager::add_related_location(), compiler_data_hooks::add_sarif_invocation_properties(), generate_results(), sarif_builder::get_or_create_artifact(), sarif_object::get_or_create_properties(), optrecord_json_writer::inlining_chain_to_json(), json_set_prime_path_coverage(), sarif_location_relationship::lazily_add_kind(), sarif_location::lazily_add_relationships_array(), sarif_builder::make_fix_object(), sarif_builder::make_replacement_object(), sarif_builder::make_result_object(), sarif_builder::make_run_object(), sarif_builder::make_tool_object(), sarif_builder::make_top_level_object(), infinite_loop_diagnostic::maybe_add_sarif_properties(), sarif_builder::maybe_make_cwe_taxonomy_object(), sarif_builder::maybe_make_physical_location_object(), json_output_format::on_report_diagnostic(), optrecord_json_writer::optinfo_to_json(), optrecord_json_writer::optrecord_json_writer(), output_intermediate_json_line(), output_json_intermediate_file(), optrecord_json_writer::pass_to_json(), sarif_artifact::populate_contents(), sarif_artifact::populate_roles(), sarif_builder::populate_thread_flow_location_object(), sarif_invocation::prepare_to_flush(), sarif_code_flow::sarif_code_flow(), sarif_ice_notification::sarif_ice_notification(), sarif_invocation::sarif_invocation(), sarif_thread_flow::sarif_thread_flow(), set(), sarif_builder::set_any_logical_locs_arr(), set_bool(), set_float(), set_integer(), and set_string().

◆ set_bool()

void object::set_bool ( const char * key,
bool v )
inherited
Set value of KEY within this object to the JSON literal true or false, based on V.

References set().

Referenced by sarif_builder::make_location_object(), json_output_format::on_report_diagnostic(), output_intermediate_json_line(), and sarif_invocation::prepare_to_flush().

◆ set_float()

void object::set_float ( const char * key,
double v )
inherited
Set value of KEY within this object to a JSON floating point value based on V.

References set().

◆ set_integer()

◆ set_string()

Field Documentation

◆ m_included_from_locations

std::map<location_t, sarif_location *> sarif_location_manager::m_included_from_locations
private

Referenced by process_worklist_item().

◆ m_keys

auto_vec<const char *> json::object::m_keys
privateinherited

Referenced by print(), and set().

◆ m_map

map_t json::object::m_map
privateinherited

Referenced by get(), is_empty(), print(), set(), and ~object().

◆ m_next_location_id

unsigned sarif_location_manager::m_next_location_id
private

◆ m_related_locations_arr

json::array* sarif_location_manager::m_related_locations_arr
private

◆ m_unlabelled_secondary_locations

std::map<location_t, sarif_location *> sarif_location_manager::m_unlabelled_secondary_locations
private

Referenced by process_worklist_item().

◆ m_worklist

std::list<worklist_item> sarif_location_manager::m_worklist
private

The documentation for this class was generated from the following file: