{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "additionalProperties": false,
  "definitions": {
    "attachment": {
      "description": "A file relevant to a tool invocation or to a result.",
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "description": {
          "$ref": "#/definitions/message",
          "description": "A message describing the role played by the attachment."
        },
        "fileLocation": {
          "$ref": "#/definitions/fileLocation",
          "description": "The location of the attachment."
        },
        "regions": {
          "description": "An array of regions of interest within the attachment.",
          "type": "array",
          "minItems": 1,
          "uniqueItems": true,
          "items": {
            "$ref": "#/definitions/region"
          }
        },
        "rectangles": {
          "description": "An array of rectangles specifying areas of interest within the image.",
          "type": "array",
          "minItems": 1,
          "uniqueItems": true,
          "items": {
            "$ref": "#/definitions/rectangle"
          }
        }
      },
      "required": ["fileLocation"]
    },
    "codeFlow": {
      "description": "A set of threadFlows which together describe a pattern of code execution relevant to detecting a result.",
      "additionalProperties": false,
      "type": "object",
      "properties": {
        "message": {
          "$ref": "#/definitions/message",
          "description": "A message relevant to the code flow."
        },
        "threadFlows": {
          "description": "An array of one or more unique threadFlow objects, each of which describes the progress of a program through a thread of execution.",
          "type": "array",
          "minItems": 1,
          "uniqueItems": true,
          "items": {
            "$ref": "#/definitions/threadFlow"
          }
        },
        "properties": {
          "description": "Key/value pairs that provide additional information about the code flow.",
          "type": "object",
          "additionalProperties": true,
          "properties": {
            "tags": {
              "description": "A set of distinct strings that provide additional information.",
              "type": "array",
              "uniqueItems": true,
              "default": [],
              "items": {
                "type": "string"
              }
            }
          }
        }
      },
      "required": ["threadFlows"]
    },
    "conversion": {
      "description": "Describes how a converter transformed the output of a static analysis tool from the analysis tool's native output format into the SARIF format.",
      "additionalProperties": false,
      "type": "object",
      "properties": {
        "tool": {
          "$ref": "#/definitions/tool",
          "description": "A tool object that describes the converter."
        },
        "invocation": {
          "$ref": "#/definitions/invocation",
          "description": "An invocation object that describes the invocation of the converter."
        },
        "analysisToolLogFiles": {
          "description": "The locations of the analysis tool's per-run log files.",
          "type": "array",
          "minItems": 1,
          "uniqueItems": true,
          "items": {
            "$ref": "#/definitions/fileLocation"
          }
        }
      },
      "required": ["tool"]
    },
    "edge": {
      "description": "Represents a directed edge in a graph.",
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "id": {
          "description": "A string that uniquely identifies the edge within its graph.",
          "type": "string"
        },
        "label": {
          "$ref": "#/definitions/message",
          "description": "A short description of the edge."
        },
        "sourceNodeId": {
          "description": "Identifies the source node (the node at which the edge starts).",
          "type": "string"
        },
        "targetNodeId": {
          "description": "Identifies the target node (the node at which the edge ends).",
          "type": "string"
        },
        "properties": {
          "description": "Key/value pairs that provide additional information about the edge.",
          "type": "object",
          "additionalProperties": true,
          "properties": {
            "tags": {
              "description": "A set of distinct strings that provide additional information.",
              "type": "array",
              "uniqueItems": true,
              "default": [],
              "items": {
                "type": "string"
              }
            }
          }
        }
      },
      "required": ["id", "sourceNodeId", "targetNodeId"]
    },
    "edgeTraversal": {
      "description": "Represents the traversal of a single edge during a graph traversal.",
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "edgeId": {
          "description": "Identifies the edge being traversed.",
          "type": "string"
        },
        "message": {
          "$ref": "#/definitions/message",
          "description": "A message to display to the user as the edge is traversed."
        },
        "finalState": {
          "description": "The values of relevant expressions after the edge has been traversed.",
          "type": "object",
          "additionalProperties": {
            "type": "string"
          }
        },
        "stepOverEdgeCount": {
          "description": "The number of edge traversals necessary to return from a nested graph.",
          "type": "integer"
        },
        "properties": {
          "description": "Key/value pairs that provide additional information about the edge traversal.",
          "type": "object",
          "additionalProperties": true,
          "properties": {
            "tags": {
              "description": "A set of distinct strings that provide additional information.",
              "type": "array",
              "uniqueItems": true,
              "default": [],
              "items": {
                "type": "string"
              }
            }
          }
        }
      },
      "required": ["edgeId"]
    },
    "exception": {
      "type": "object",
      "properties": {
        "kind": {
          "type": "string",
          "description": "A string that identifies the kind of exception, for example, the fully qualified type name of an object that was thrown, or the symbolic name of a signal."
        },
        "message": {
          "type": "string",
          "description": "A plain text message that describes the exception."
        },
        "stack": {
          "$ref": "#/definitions/stack",
          "description": "The sequence of function calls leading to the exception."
        },
        "innerExceptions": {
          "type": "array",
          "description": "An array of exception objects each of which is considered a cause of this exception.",
          "items": {
            "$ref": "#/definitions/exception"
          }
        }
      }
    },
    "externalFiles": {
      "description": "References to external files that should be inlined with the content of a root log file.",
      "additionalProperties": false,
      "type": "object",
      "properties": {
        "conversion": {
          "$ref": "#/definitions/fileLocation",
          "description": "The location of a file containing a run.conversion object to be merged with the root log file."
        },
        "files": {
          "$ref": "#/definitions/fileLocation",
          "description": "The location of a file containing a run.files object to be merged with the root log file."
        },
        "graphs": {
          "$ref": "#/definitions/fileLocation",
          "description": "The location of a file containing a run.graphs object to be merged with the root log file."
        },
        "invocations": {
          "description": "An array of locations of files containing arrays of run.invocation objects to be merged with the root log file.",
          "type": "array",
          "minItems": 1,
          "uniqueItems": true,
          "items": {
            "$ref": "#/definitions/fileLocation"
          }
        },
        "logicalLocations": {
          "$ref": "#/definitions/fileLocation",
          "description": "The location of a file containing a run.logicalLocations object to be merged with the root log file."
        },
        "resources": {
          "$ref": "#/definitions/fileLocation",
          "description": "The location of a file containing a run.resources object to be merged with the root log file."
        },
        "results": {
          "description": "An array of locations of files containing arrays of run.result objects to be merged with the root log file.",
          "type": "array",
          "minItems": 1,
          "uniqueItems": true,
          "items": {
            "$ref": "#/definitions/fileLocation"
          }
        }
      }
    },
    "file": {
      "description": "A single file. In some cases, this file might be nested within another file.",
      "additionalProperties": false,
      "type": "object",
      "properties": {
        "fileLocation": {
          "$ref": "#/definitions/fileLocation",
          "description": "The location of the file."
        },
        "parentKey": {
          "description": "Identifies the key of the immediate parent of the file, if this file is nested.",
          "type": "string"
        },
        "offset": {
          "description": "The offset in bytes of the file within its containing file.",
          "type": "integer"
        },
        "length": {
          "description": "The length of the file in bytes.",
          "type": "integer"
        },
        "roles": {
          "description": "The role or roles played by the file in the analysis.",
          "type": "array",
          "minItems": 1,
          "uniqueItems": true,
          "items": {
            "enum": [
              "analysisTarget",
              "attachment",
              "responseFile",
              "resultFile",
              "standardStream",
              "traceFile",
              "unmodifiedFile",
              "modifiedFile",
              "addedFile",
              "deletedFile",
              "renamedFile",
              "uncontrolledFile"
            ]
          }
        },
        "mimeType": {
          "description": "The MIME type (RFC 2045) of the file.",
          "type": "string",
          "pattern": "[^/]+/.+"
        },
        "contents": {
          "$ref": "#/definitions/fileContent",
          "description": "The contents of the file."
        },
        "encoding": {
          "description": "Specifies the encoding for a file object that refers to a text file.",
          "type": "string"
        },
        "hashes": {
          "description": "An array of hash objects, each of which specifies a hashed value for the file, along with the name of the hash function used to compute the hash.",
          "type": "array",
          "minItems": 1,
          "uniqueItems": true,
          "items": {
            "$ref": "#/definitions/hash"
          }
        },
        "lastModifiedTime": {
          "description": "The date and time at which the file was most recently modified. See \"Date/time properties\" in the SARIF spec for the required format.",
          "type": "string",
          "format": "date-time"
        },
        "properties": {
          "description": "Key/value pairs that provide additional information about the file.",
          "type": "object",
          "additionalProperties": true,
          "properties": {
            "tags": {
              "description": "A set of distinct strings that provide additional information.",
              "type": "array",
              "uniqueItems": true,
              "default": [],
              "items": {
                "type": "string"
              }
            }
          }
        }
      }
    },
    "fileChange": {
      "description": "A change to a single file.",
      "additionalProperties": false,
      "type": "object",
      "properties": {
        "fileLocation": {
          "$ref": "#/definitions/fileLocation",
          "description": "The location of the file to change."
        },
        "replacements": {
          "description": "An array of replacement objects, each of which represents the replacement of a single region in a single file specified by 'fileLocation'.",
          "type": "array",
          "minItems": 1,
          "items": {
            "$ref": "#/definitions/replacement"
          }
        }
      },
      "required": ["fileLocation", "replacements"]
    },
    "fileContent": {
      "description": "Represents content from an external file.",
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "text": {
          "description": "UTF-8-encoded content from a text file.",
          "type": "string"
        },
        "binary": {
          "description": "MIME Base64-encoded content from a binary file, or from a text file in its original encoding.",
          "type": "string"
        }
      }
    },
    "fileLocation": {
      "description": "Specifies the location of a file.",
      "additionalProperties": false,
      "type": "object",
      "properties": {
        "uri": {
          "description": "A string containing a valid relative or absolute URI.",
          "type": "string",
          "format": "uri-reference"
        },
        "uriBaseId": {
          "description": "A string which indirectly specifies the absolute URI with respect to which a relative URI in the \"uri\" property is interpreted.",
          "type": "string"
        }
      },
      "required": ["uri"]
    },
    "fix": {
      "description": "A proposed fix for the problem represented by a result object. A fix specifies a set of file to modify. For each file, it specifies a set of bytes to remove, and provides a set of new bytes to replace them.",
      "additionalProperties": false,
      "type": "object",
      "properties": {
        "description": {
          "$ref": "#/definitions/message",
          "description": "A message that describes the proposed fix, enabling viewers to present the proposed change to an end user."
        },
        "fileChanges": {
          "description": "One or more file changes that comprise a fix for a result.",
          "type": "array",
          "items": {
            "$ref": "#/definitions/fileChange"
          }
        }
      },
      "required": ["fileChanges"]
    },
    "graph": {
      "description": "A network of nodes and directed edges that describes some aspect of the structure of the code (for example, a call graph).",
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "id": {
          "description": "A string that uniquely identifies the graph within a run.graphs or result.graphs array.",
          "type": "string"
        },
        "description": {
          "$ref": "#/definitions/message",
          "description": "A description of the graph."
        },
        "nodes": {
          "description": "An array of node objects representing the nodes of the graph.",
          "type": "array",
          "items": {
            "$ref": "#/definitions/node"
          }
        },
        "edges": {
          "description": "An array of edge objects representing the edges of the graph.",
          "type": "array",
          "items": {
            "$ref": "#/definitions/edge"
          }
        },
        "properties": {
          "description": "Key/value pairs that provide additional information about the graph.",
          "type": "object",
          "additionalProperties": true,
          "properties": {
            "tags": {
              "description": "A set of distinct strings that provide additional information.",
              "type": "array",
              "uniqueItems": true,
              "default": [],
              "items": {
                "type": "string"
              }
            }
          }
        }
      },
      "required": ["id", "nodes", "edges"]
    },
    "graphTraversal": {
      "description": "Represents a path through a graph.",
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "graphId": {
          "description": "A string that uniquely identifies that graph being traversed.",
          "type": "string"
        },
        "description": {
          "$ref": "#/definitions/message",
          "description": "A description of this graph traversal."
        },
        "initialState": {
          "description": "Values of relevant expressions at the start of the graph traversal.",
          "type": "object",
          "additionalProperties": {
            "type": "string"
          }
        },
        "edgeTraversals": {
          "description": "The sequences of edges traversed by this graph traversal.",
          "type": "array",
          "items": {
            "$ref": "#/definitions/edgeTraversal"
          }
        },
        "properties": {
          "description": "Key/value pairs that provide additional information about the graph traversal.",
          "type": "object",
          "additionalProperties": true,
          "properties": {
            "tags": {
              "description": "A set of distinct strings that provide additional information.",
              "type": "array",
              "uniqueItems": true,
              "default": [],
              "items": {
                "type": "string"
              }
            }
          }
        }
      },
      "required": ["graphId", "edgeTraversals"]
    },
    "hash": {
      "description": "A hash value of some file or collection of files, together with the hash function used to compute the hash.",
      "additionalProperties": false,
      "type": "object",
      "properties": {
        "value": {
          "description": "The hash value of some file or collection of files, computed by the hash function named in the 'algorithm' property.",
          "type": "string"
        },
        "algorithm": {
          "description": "The name of the hash function used to compute the hash value specified in the 'value' property.",
          "type": "string"
        }
      },
      "required": ["value", "algorithm"]
    },
    "invocation": {
      "description": "The runtime environment of the analysis tool run.",
      "additionalProperties": false,
      "type": "object",
      "properties": {
        "commandLine": {
          "description": "The command line used to invoke the tool.",
          "type": "string"
        },
        "arguments": {
          "description": "An array of strings, containing in order the command line arguments passed to the tool from the operating system.",
          "type": "array",
          "items": {
            "type": "string"
          }
        },
        "responseFiles": {
          "description": "The locations of any response files specified on the tool's command line.",
          "type": "array",
          "items": {
            "$ref": "#/definitions/fileLocation"
          }
        },
        "attachments": {
          "description": "A set of files relevant to the invocation of the tool.",
          "type": "array",
          "minItems": 1,
          "uniqueItems": true,
          "items": {
            "$ref": "#/definitions/attachment"
          }
        },
        "startTime": {
          "description": "The date and time at which the run started. See \"Date/time properties\" in the SARIF spec for the required format.",
          "type": "string",
          "format": "date-time"
        },
        "endTime": {
          "description": "The date and time at which the run ended. See \"Date/time properties\" in the SARIF spec for the required format.",
          "type": "string",
          "format": "date-time"
        },
        "exitCode": {
          "description": "The process exit code.",
          "type": "integer"
        },
        "toolNotifications": {
          "description": "A list of runtime conditions detected by the tool during the analysis.",
          "type": "array",
          "items": {
            "$ref": "#/definitions/notification"
          }
        },
        "configurationNotifications": {
          "description": "A list of conditions detected by the tool that are relevant to the tool's configuration.",
          "type": "array",
          "items": {
            "$ref": "#/definitions/notification"
          }
        },
        "exitCodeDescription": {
          "description": "The reason for the process exit.",
          "type": "string"
        },
        "exitSignalName": {
          "description": "The name of the signal that caused the process to exit.",
          "type": "string"
        },
        "exitSignalNumber": {
          "description": "The numeric value of the signal that caused the process to exit.",
          "type": "integer"
        },
        "processStartFailureMessage": {
          "description": "The reason given by the operating system that the process failed to start.",
          "type": "string"
        },
        "toolExecutionSuccessful": {
          "description": "A value indicating whether the tool's execution completed successfully.",
          "type": "boolean"
        },
        "machine": {
          "description": "The machine that hosted the analysis tool run.",
          "type": "string"
        },
        "account": {
          "description": "The account that ran the analysis tool.",
          "type": "string"
        },
        "processId": {
          "description": "The process id for the analysis tool run.",
          "type": "integer"
        },
        "executableLocation": {
          "$ref": "#/definitions/fileLocation",
          "description": "An absolute URI specifying the location of the analysis tool's executable."
        },
        "workingDirectory": {
          "$ref": "#/definitions/fileLocation",
          "description": "The working directory for the analysis tool run."
        },
        "environmentVariables": {
          "description": "The environment variables associated with the analysis tool process, expressed as key/value pairs.",
          "type": "object",
          "additionalProperties": true,
          "default": {}
        },
        "stdin": {
          "$ref": "#/definitions/fileLocation",
          "description": "A file containing the standard input stream to the process that was invoked."
        },
        "stdout": {
          "$ref": "#/definitions/fileLocation",
          "description": "A file containing the standard output stream from the process that was invoked."
        },
        "stderr": {
          "$ref": "#/definitions/fileLocation",
          "description": "A file containing the standard error stream from the process that was invoked."
        },
        "stdoutStderr": {
          "$ref": "#/definitions/fileLocation",
          "description": "A file containing the interleaved standard output and standard error stream from the process that was invoked."
        },
        "properties": {
          "description": "Key/value pairs that provide additional information about the invocation.",
          "type": "object",
          "additionalProperties": true,
          "properties": {
            "tags": {
              "description": "A set of distinct strings that provide additional information.",
              "type": "array",
              "uniqueItems": true,
              "default": [],
              "items": {
                "type": "string"
              }
            }
          }
        }
      }
    },
    "location": {
      "description": "A location within a programming artifact.",
      "additionalProperties": false,
      "type": "object",
      "properties": {
        "physicalLocation": {
          "$ref": "#/definitions/physicalLocation",
          "description": "Identifies the file and region."
        },
        "fullyQualifiedLogicalName": {
          "description": "The human-readable fully qualified name of the logical location. If run.logicalLocations is present, this value matches a property name within that object, from which further information about the logical location can be obtained.",
          "type": "string"
        },
        "message": {
          "$ref": "#/definitions/message",
          "description": "A message relevant to the location."
        },
        "annotations": {
          "description": "A set of regions relevant to the location.",
          "type": "array",
          "minItems": 1,
          "uniqueItems": true,
          "items": {
            "$ref": "#/definitions/region"
          }
        },
        "properties": {
          "description": "Key/value pairs that provide additional information about the location.",
          "type": "object",
          "additionalProperties": true,
          "properties": {
            "tags": {
              "description": "A set of distinct strings that provide additional information.",
              "type": "array",
              "uniqueItems": true,
              "default": [],
              "items": {
                "type": "string"
              }
            }
          }
        }
      }
    },
    "logicalLocation": {
      "description": "A logical location of a construct that produced a result.",
      "additionalProperties": false,
      "type": "object",
      "properties": {
        "name": {
          "description": "Identifies the construct in which the result occurred. For example, this property might contain the name of a class or a method.",
          "type": "string"
        },
        "fullyQualifiedName": {
          "description": "The human-readable fully qualified name of the logical location.",
          "type": "string"
        },
        "decoratedName": {
          "description": "The machine-readable name for the logical location, such as a mangled function name provided by a C++ compiler that encodes calling convention, return type and other details along with the function name.",
          "type": "string"
        },
        "parentKey": {
          "description": "Identifies the key of the immediate parent of the construct in which the result was detected. For example, this property might point to a logical location that represents the namespace that holds a type.",
          "type": "string"
        },
        "kind": {
          "description": "The type of construct this logicalLocationComponent refers to. Should be one of 'function', 'member', 'module', 'namespace', 'package', 'parameter', 'resource', 'returnType', 'type', or 'variable', if any of those accurately describe the construct.",
          "type": "string"
        }
      }
    },
    "message": {
      "description": "Encapsulates a message intended to be read by the end user.",
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "text": {
          "description": "A plain text message string.",
          "type": "string"
        },
        "messageId": {
          "description": "The resource id for a plain text message string.",
          "type": "string"
        },
        "richText": {
          "description": "A rich text message string.",
          "type": "string"
        },
        "richMessageId": {
          "description": "The resource id for a rich text message string.",
          "type": "string"
        },
        "arguments": {
          "description": "An array of strings to substitute into the message string.",
          "type": "array",
          "items": {
            "type": "string"
          }
        }
      }
    },
    "node": {
      "description": "Represents a node in a graph.",
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "id": {
          "description": "A string that uniquely identifies the node within its graph.",
          "type": "string"
        },
        "label": {
          "$ref": "#/definitions/message",
          "description": "A short description of the node."
        },
        "location": {
          "$ref": "#/definitions/location",
          "description": "A code location associated with the node."
        },
        "children": {
          "description": "Array of child nodes.",
          "type": "array",
          "uniqueItems": true,
          "items": {
            "$ref": "#/definitions/node"
          }
        },
        "properties": {
          "description": "Key/value pairs that provide additional information about the node.",
          "type": "object",
          "additionalProperties": true,
          "properties": {
            "tags": {
              "description": "A set of distinct strings that provide additional information.",
              "type": "array",
              "uniqueItems": true,
              "default": [],
              "items": {
                "type": "string"
              }
            }
          }
        }
      },
      "required": ["id"]
    },
    "notification": {
      "description": "Describes a condition relevant to the tool itself, as opposed to being relevant to a target being analyzed by the tool.",
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "id": {
          "description": "An identifier for the condition that was encountered.",
          "type": "string"
        },
        "ruleId": {
          "description": "The stable, unique identifier of the rule (if any) to which this notification is relevant. This member can be used to retrieve rule metadata from the rules dictionary, if it exists.",
          "type": "string"
        },
        "physicalLocation": {
          "$ref": "#/definitions/physicalLocation",
          "description": "The file and region relevant to this notification."
        },
        "message": {
          "$ref": "#/definitions/message",
          "description": "A message that describes the condition that was encountered."
        },
        "level": {
          "description": "A value specifying the severity level of the notification.",
          "default": "warning",
          "enum": ["note", "warning", "error"]
        },
        "threadId": {
          "description": "The thread identifier of the code that generated the notification.",
          "type": "integer"
        },
        "time": {
          "description": "The date and time at which the analysis tool generated the notification.",
          "type": "string",
          "format": "date-time"
        },
        "exception": {
          "$ref": "#/definitions/exception",
          "description": "The runtime exception, if any, relevant to this notification."
        },
        "properties": {
          "description": "Key/value pairs that provide additional information about the notification.",
          "type": "object",
          "additionalProperties": true,
          "properties": {
            "tags": {
              "description": "A set of distinct strings that provide additional information.",
              "type": "array",
              "uniqueItems": true,
              "default": [],
              "items": {
                "type": "string"
              }
            }
          }
        }
      },
      "required": ["message"]
    },
    "physicalLocation": {
      "description": "A physical location relevant to a result. Specifies a reference to a programming artifact together with a range of bytes or characters within that artifact.",
      "additionalProperties": false,
      "type": "object",
      "properties": {
        "id": {
          "description": "Value that distinguishes this physical location from all other physical locations in this run object.",
          "type": "integer"
        },
        "fileLocation": {
          "$ref": "#/definitions/fileLocation",
          "description": "The location of the file."
        },
        "region": {
          "$ref": "#/definitions/region",
          "description": "Specifies a portion of the file."
        },
        "contextRegion": {
          "$ref": "#/definitions/region",
          "description": "Specifies a portion of the file that encloses the region. Allows a viewer to display additional context around the region."
        }
      },
      "required": ["fileLocation"]
    },
    "rectangle": {
      "description": "An area within an image.",
      "additionalProperties": false,
      "type": "object",
      "properties": {
        "top": {
          "description": "The Y coordinate of the top edge of the rectangle, measured in the image's natural units.",
          "type": "number"
        },
        "left": {
          "description": "The X coordinate of the left edge of the rectangle, measured in the image's natural units.",
          "type": "number"
        },
        "bottom": {
          "description": "The Y coordinate of the bottom edge of the rectangle, measured in the image's natural units.",
          "type": "number"
        },
        "right": {
          "description": "The X coordinate of the right edge of the rectangle, measured in the image's natural units.",
          "type": "number"
        },
        "message": {
          "$ref": "#/definitions/message",
          "description": "A message relevant to the rectangle."
        }
      }
    },
    "region": {
      "description": "A region within a file where a result was detected.",
      "additionalProperties": false,
      "type": "object",
      "properties": {
        "startLine": {
          "description": "The line number of the first character in the region.",
          "type": "integer",
          "minimum": 1
        },
        "startColumn": {
          "description": "The column number of the first character in the region.",
          "type": "integer",
          "minimum": 1
        },
        "endLine": {
          "description": "The line number of the last character in the region.",
          "type": "integer",
          "minimum": 1
        },
        "endColumn": {
          "description": "The column number of the character following the end of the region.",
          "type": "integer",
          "minimum": 1
        },
        "charOffset": {
          "description": "The zero-based offset from the beginning of the file of the first character in the region.",
          "type": "integer",
          "minimum": 0
        },
        "charLength": {
          "description": "The length of the region in characters.",
          "type": "integer",
          "minimum": 0
        },
        "byteOffset": {
          "description": "The zero-based offset from the beginning of the file of the first byte in the region.",
          "type": "integer",
          "minimum": 0
        },
        "byteLength": {
          "description": "The length of the region in bytes.",
          "type": "integer",
          "minimum": 0
        },
        "snippet": {
          "$ref": "#/definitions/fileContent",
          "description": "The portion of the file contents within the specified region."
        },
        "message": {
          "$ref": "#/definitions/message",
          "description": "A message relevant to the region."
        }
      }
    },
    "replacement": {
      "description": "The replacement of a single region of a file.",
      "additionalProperties": false,
      "type": "object",
      "properties": {
        "deletedRegion": {
          "$ref": "#/definitions/region",
          "description": "The region of the file to delete."
        },
        "insertedContent": {
          "$ref": "#/definitions/fileContent",
          "description": "The content to insert at the location specified by the 'deletedRegion' property."
        }
      },
      "required": ["deletedRegion"]
    },
    "resources": {
      "description": "Container for items that require localization.",
      "type": "object",
      "properties": {
        "messageStrings": {
          "description": "A dictionary, each of whose keys is a resource identifier and each of whose values is a localized string.",
          "type": "object",
          "additionalProperties": {
            "type": "string"
          }
        },
        "rules": {
          "description": "A dictionary, each of whose keys is a string and each of whose values is a 'rule' object, that describe all rules associated with an analysis tool or a specific run of an analysis tool.",
          "type": "object",
          "additionalProperties": {
            "$ref": "#/definitions/rule"
          }
        }
      }
    },
    "result": {
      "description": "A result produced by an analysis tool.",
      "additionalProperties": false,
      "type": "object",
      "properties": {
        "ruleId": {
          "description": "The stable, unique identifier of the rule (if any) to which this notification is relevant. This member can be used to retrieve rule metadata from the rules dictionary, if it exists.",
          "type": "string"
        },
        "level": {
          "description": "A value specifying the severity level of the result.",
          "enum": ["notApplicable", "pass", "note", "warning", "error", "open"]
        },
        "message": {
          "$ref": "#/definitions/message",
          "description": "A message that describes the result. The first sentence of the message only will be displayed when visible space is limited."
        },
        "analysisTarget": {
          "$ref": "#/definitions/fileLocation",
          "description": "Identifies the file that the analysis tool was instructed to scan. This need not be the same as the file where the result actually occurred."
        },
        "locations": {
          "description": "One or more locations where the result occurred. Specify only one location unless the problem indicated by the result can only be corrected by making a change at every specified location.",
          "type": "array",
          "minItems": 1,
          "uniqueItems": true,
          "items": {
            "$ref": "#/definitions/location"
          }
        },
        "instanceGuid": {
          "description": "A stable, unique identifier for the result in the form of a GUID.",
          "type": "string"
        },
        "correlationGuid": {
          "description": "A stable, unique identifier for the equivalence class of logically identical results to which this result belongs, in the form of a GUID.",
          "type": "string"
        },
        "partialFingerprints": {
          "description": "A set of strings that contribute to the stable, unique identity of the result.",
          "type": "object",
          "additionalProperties": {
            "type": "string"
          }
        },
        "fingerprints": {
          "description": "A set of strings each of which individually defines a stable, unique identity for the result.",
          "type": "object",
          "additionalProperties": {
            "type": "string"
          }
        },
        "stacks": {
          "description": "An array of 'stack' objects relevant to the result.",
          "type": "array",
          "minItems": 1,
          "uniqueItems": true,
          "items": {
            "$ref": "#/definitions/stack"
          }
        },
        "codeFlows": {
          "description": "An array of 'codeFlow' objects relevant to the result.",
          "type": "array",
          "minItems": 1,
          "uniqueItems": true,
          "items": {
            "$ref": "#/definitions/codeFlow"
          }
        },
        "graphs": {
          "description": "An array of one or more unique 'graph' objects.",
          "type": "array",
          "minItems": 1,
          "uniqueItems": true,
          "items": {
            "$ref": "#/definitions/graph"
          }
        },
        "graphTraversals": {
          "description": "An array of one or more unique 'graphTraversal' objects.",
          "type": "array",
          "minItems": 1,
          "uniqueItems": true,
          "items": {
            "$ref": "#/definitions/graphTraversal"
          }
        },
        "relatedLocations": {
          "description": "A set of locations relevant to this result.",
          "type": "array",
          "minItems": 1,
          "uniqueItems": true,
          "items": {
            "$ref": "#/definitions/location"
          }
        },
        "suppressionStates": {
          "description": "A set of flags indicating one or more suppression conditions.",
          "type": "array",
          "items": {
            "enum": ["suppressedInSource", "suppressedExternally"]
          }
        },
        "baselineState": {
          "description": "The state of a result relative to a baseline of a previous run.",
          "enum": ["new", "existing", "absent"]
        },
        "attachments": {
          "description": "A set of files relevant to the result.",
          "type": "array",
          "minItems": 1,
          "uniqueItems": true,
          "items": {
            "$ref": "#/definitions/attachment"
          }
        },
        "workItemUris": {
          "description": "The URIs of the work items associated with this result",
          "type": "array",
          "minItems": 1,
          "uniqueItems": true,
          "items": {
            "type": "string",
            "format": "uri"
          }
        },
        "conversionProvenance": {
          "description": "An array of physicalLocation objects which specify the portions of an analysis tool's output that a converter transformed into the result object.",
          "type": "array",
          "minItems": 1,
          "uniqueItems": true,
          "items": {
            "$ref": "#/definitions/physicalLocation"
          }
        },
        "fixes": {
          "description": "An array of 'fix' objects, each of which represents a proposed fix to the problem indicated by the result.",
          "type": "array",
          "minItems": 1,
          "uniqueItems": true,
          "items": {
            "$ref": "#/definitions/fix"
          }
        },
        "properties": {
          "description": "Key/value pairs that provide additional information about the result.",
          "type": "object",
          "additionalProperties": true,
          "properties": {
            "tags": {
              "description": "A set of distinct strings that provide additional information.",
              "type": "array",
              "uniqueItems": true,
              "default": [],
              "items": {
                "type": "string"
              }
            }
          }
        }
      }
    },
    "rule": {
      "description": "Describes an analysis rule.",
      "additionalProperties": false,
      "type": "object",
      "properties": {
        "id": {
          "description": "A stable, opaque identifier for the rule.",
          "type": "string"
        },
        "name": {
          "$ref": "#/definitions/message",
          "description": "A rule identifier that is understandable to an end user."
        },
        "shortDescription": {
          "$ref": "#/definitions/message",
          "description": "A concise description of the rule. Should be a single sentence that is understandable when visible space is limited to a single line of text."
        },
        "fullDescription": {
          "$ref": "#/definitions/message",
          "description": "A description of the rule. Should, as far as possible, provide details sufficient to enable resolution of any problem indicated by the result."
        },
        "messageStrings": {
          "description": "A set of name/value pairs with arbitrary names. The value within each name/value pair consists of plain text interspersed with placeholders, which can be used to construct a message in combination with an arbitrary number of additional string arguments.",
          "type": "object",
          "additionalProperties": {
            "type": "string"
          }
        },
        "richMessageStrings": {
          "description": "A set of name/value pairs with arbitrary names. The value within each name/value pair consists of rich text interspersed with placeholders, which can be used to construct a message in combination with an arbitrary number of additional string arguments.",
          "type": "object",
          "additionalProperties": {
            "type": "string"
          }
        },
        "configuration": {
          "$ref": "#/definitions/ruleConfiguration",
          "description": "Information about the rule that can be configured at runtime."
        },
        "helpUri": {
          "description": "A URI where the primary documentation for the rule can be found.",
          "type": "string",
          "format": "uri"
        },
        "help": {
          "$ref": "#/definitions/message",
          "description": "Provides the primary documentation for the rule, useful when there is no online documentation."
        },
        "properties": {
          "description": "Key/value pairs that provide additional information about the rule.",
          "type": "object",
          "additionalProperties": true,
          "properties": {
            "tags": {
              "description": "A set of distinct strings that provide additional information.",
              "type": "array",
              "uniqueItems": true,
              "default": [],
              "items": {
                "type": "string"
              }
            }
          }
        }
      },
      "required": ["id"]
    },
    "ruleConfiguration": {
      "description": "Information about a rule that can be configured at runtime.",
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "enabled": {
          "description": "Specifies whether the rule will be evaluated during the scan.",
          "type": "boolean"
        },
        "defaultLevel": {
          "description": "Specifies the default severity level of the result.",
          "default": "warning",
          "enum": ["note", "warning", "error", "open"]
        },
        "parameters": {
          "description": "Contains configuration information specific to this rule.",
          "type": "object",
          "additionalProperties": true,
          "properties": {
            "tags": {
              "description": "A set of distinct strings that provide additional configuration information.",
              "type": "array",
              "uniqueItems": true,
              "default": [],
              "items": {
                "type": "string"
              }
            }
          }
        }
      }
    },
    "run": {
      "description": "Describes a single run of an analysis tool, and contains the output of that run.",
      "additionalProperties": false,
      "type": "object",
      "properties": {
        "tool": {
          "$ref": "#/definitions/tool",
          "description": "Information about the tool or tool pipeline that generated the results in this run. A run can only contain results produced by a single tool or tool pipeline. A run can aggregate results from multiple log files, as long as context around the tool run (tool command-line arguments and the like) is identical for all aggregated files."
        },
        "invocations": {
          "description": "Describes the invocation of the analysis tool.",
          "type": "array",
          "minItems": 1,
          "uniqueItems": true,
          "items": {
            "$ref": "#/definitions/invocation"
          }
        },
        "conversion": {
          "$ref": "#/definitions/conversion",
          "description": "A conversion object that describes how a converter transformed an analysis tool's native output format into the SARIF format."
        },
        "versionControlProvenance": {
          "description": "Specifies the revision in version control of the files that were scanned.",
          "type": "array",
          "minItems": 1,
          "uniqueItems": true,
          "items": {
            "$ref": "#/definitions/versionControlDetails"
          }
        },
        "originalUriBaseIds": {
          "description": "The absolute URI specified by each uriBaseId symbol on the machine where the tool originally ran.",
          "type": "object",
          "additionalProperties": {
            "type": "string",
            "format": "uri"
          }
        },
        "files": {
          "description": "A dictionary, each of whose keys is a URI and each of whose values is a file object.",
          "type": "object",
          "additionalProperties": {
            "$ref": "#/definitions/file"
          }
        },
        "logicalLocations": {
          "description": "A dictionary, each of whose keys specifies a logical location such as a namespace, type or function.",
          "type": "object",
          "additionalProperties": {
            "$ref": "#/definitions/logicalLocation"
          }
        },
        "graphs": {
          "description": "An array of one or more unique 'graph' objects.",
          "type": "array",
          "minItems": 1,
          "uniqueItems": true,
          "items": {
            "$ref": "#/definitions/graph"
          }
        },
        "results": {
          "description": "The set of results contained in an SARIF log. The results array can be omitted when a run is solely exporting rules metadata. It must be present (but may be empty) if a log file represents an actual scan.",
          "type": "array",
          "minItems": 0,
          "items": {
            "$ref": "#/definitions/result"
          }
        },
        "resources": {
          "$ref": "#/definitions/resources",
          "description": "Items that can be localized, such as message strings and rule metadata."
        },
        "instanceGuid": {
          "description": "A stable, unique identifier for the run, in the form of a GUID.",
          "type": "string"
        },
        "correlationGuid": {
          "description": "A stable, unique identifier for the class of related runs to which this run belongs, in the form of a GUID.",
          "type": "string"
        },
        "logicalId": {
          "description": "A logical identifier for a run, for example, 'nightly Clang analyzer run'. Multiple runs of the same type can have the same logical id.",
          "type": "string"
        },
        "description": {
          "$ref": "#/definitions/message",
          "description": "A description of the run."
        },
        "automationLogicalId": {
          "description": "A global identifier that allows the run to be correlated with other artifacts produced by a larger automation process.",
          "type": "string"
        },
        "baselineInstanceGuid": {
          "description": "The 'instanceGuid' property of a previous SARIF 'run' that comprises the baseline that was used to compute result 'baselineState' properties for the run.",
          "type": "string"
        },
        "architecture": {
          "description": "The hardware architecture for which the run was targeted.",
          "type": "string"
        },
        "richMessageMimeType": {
          "description": "The MIME type of all rich text message properties in the run. Default: \"text/markdown;variant=GFM\"",
          "type": "string",
          "default": "text/markdown;variant=GFM"
        },
        "redactionToken": {
          "description": "The string used to replace sensitive information in a redaction-aware property.",
          "type": "string"
        },
        "defaultFileEncoding": {
          "description": "Specifies the default encoding for any file object that refers to a text file.",
          "type": "string"
        },
        "columnKind": {
          "description": "Specifies the unit in which the tool measures columns.",
          "enum": ["utf16CodeUnits", "unicodeCodePoints"]
        },
        "properties": {
          "description": "Key/value pairs that provide additional information about the run.",
          "type": "object",
          "additionalProperties": true,
          "properties": {
            "tags": {
              "description": "A set of distinct strings that provide additional information about the run.",
              "type": "array",
              "uniqueItems": true,
              "default": [],
              "items": {
                "type": "string"
              }
            }
          }
        }
      },
      "required": ["tool"]
    },
    "stack": {
      "description": "A call stack that is relevant to a result.",
      "additionalProperties": false,
      "type": "object",
      "properties": {
        "message": {
          "$ref": "#/definitions/message",
          "description": "A message relevant to this call stack."
        },
        "frames": {
          "description": "An array of stack frames that represent a sequence of calls, rendered in reverse chronological order, that comprise the call stack.",
          "type": "array",
          "minItems": 1,
          "items": {
            "$ref": "#/definitions/stackFrame"
          }
        },
        "properties": {
          "description": "Key/value pairs that provide additional information about the stack.",
          "type": "object",
          "additionalProperties": true,
          "properties": {
            "tags": {
              "description": "A set of distinct strings that provide additional information.",
              "type": "array",
              "uniqueItems": true,
              "default": [],
              "items": {
                "type": "string"
              }
            }
          }
        }
      },
      "required": ["frames"]
    },
    "stackFrame": {
      "description": "A function call within a stack trace.",
      "additionalProperties": false,
      "type": "object",
      "properties": {
        "location": {
          "$ref": "#/definitions/location",
          "description": "The location to which this stack frame refers."
        },
        "module": {
          "description": "The name of the module that contains the code of this stack frame.",
          "type": "string"
        },
        "threadId": {
          "description": "The thread identifier of the stack frame.",
          "type": "integer"
        },
        "address": {
          "description": "The address of the method or function that is executing.",
          "type": "integer"
        },
        "offset": {
          "description": "The offset from the method or function that is executing.",
          "type": "integer"
        },
        "parameters": {
          "description": "The parameters of the call that is executing.",
          "type": "array",
          "items": {
            "type": "string",
            "default": []
          }
        },
        "properties": {
          "description": "Key/value pairs that provide additional information about the stack frame.",
          "type": "object",
          "additionalProperties": true,
          "properties": {
            "tags": {
              "description": "A set of distinct strings that provide additional information.",
              "type": "array",
              "uniqueItems": true,
              "default": [],
              "items": {
                "type": "string"
              }
            }
          }
        }
      }
    },
    "threadFlow": {
      "type": "object",
      "properties": {
        "id": {
          "description": "An string that uniquely identifies the threadFlow within the codeFlow in which it occurs.",
          "type": "string"
        },
        "message": {
          "$ref": "#/definitions/message",
          "description": "A message relevant to the thread flow."
        },
        "locations": {
          "description": "A temporally ordered array of 'threadFlowLocation' objects, each of which describes a location visited by the tool while producing the result.",
          "type": "array",
          "minItems": 1,
          "items": {
            "$ref": "#/definitions/threadFlowLocation"
          }
        },
        "properties": {
          "description": "Key/value pairs that provide additional information about the thread flow.",
          "type": "object",
          "additionalProperties": true,
          "properties": {
            "tags": {
              "description": "A set of distinct strings that provide additional information.",
              "type": "array",
              "uniqueItems": true,
              "default": [],
              "items": {
                "type": "string"
              }
            }
          }
        }
      },
      "required": ["locations"]
    },
    "threadFlowLocation": {
      "description": "A location visited by an analysis tool while simulating or monitoring the execution of a program.",
      "additionalProperties": false,
      "type": "object",
      "properties": {
        "step": {
          "description": "The 0-based sequence number of the location in the code flow within which it occurs.",
          "type": "integer",
          "minimum": 0
        },
        "location": {
          "$ref": "#/definitions/location",
          "description": "The code location."
        },
        "stack": {
          "$ref": "#/definitions/stack",
          "description": "The call stack leading to this location."
        },
        "kind": {
          "description": "A string describing the type of this location.",
          "type": "string"
        },
        "module": {
          "description": "The name of the module that contains the code that is executing.",
          "type": "string"
        },
        "state": {
          "description": "A dictionary, each of whose keys specifies a variable or expression, the associated value of which represents the variable or expression value. For an annotation of kind 'continuation', for example, this dictionary might hold the current assumed values of a set of global variables.",
          "type": "object"
        },
        "nestingLevel": {
          "description": "An integer representing a containment hierarchy within the thread flow",
          "type": "integer"
        },
        "executionOrder": {
          "description": "An integer representing the temporal order in which execution reached this location.",
          "type": "integer"
        },
        "timestamp": {
          "description": "The time at which this location was executed.",
          "type": "string",
          "format": "date-time"
        },
        "importance": {
          "description": "Specifies the importance of this location in understanding the code flow in which it occurs. The order from most to least important is \"essential\", \"important\", \"unimportant\". Default: \"important\".",
          "enum": ["important", "essential", "unimportant"]
        },
        "properties": {
          "description": "Key/value pairs that provide additional information about the code location.",
          "type": "object",
          "additionalProperties": true,
          "properties": {
            "tags": {
              "description": "A set of distinct strings that provide additional information.",
              "type": "array",
              "uniqueItems": true,
              "default": [],
              "items": {
                "type": "string"
              }
            }
          }
        }
      }
    },
    "tool": {
      "description": "The analysis tool that was run.",
      "additionalProperties": false,
      "type": "object",
      "properties": {
        "name": {
          "description": "The name of the tool.",
          "type": "string"
        },
        "fullName": {
          "description": "The name of the tool along with its version and any other useful identifying information, such as its locale.",
          "type": "string"
        },
        "version": {
          "description": "The tool version, in whatever format the tool natively provides.",
          "type": "string"
        },
        "semanticVersion": {
          "description": "The tool version in the format specified by Semantic Versioning 2.0.",
          "type": "string"
        },
        "fileVersion": {
          "description": "The binary version of the tool's primary executable file (for operating systems such as Windows that provide that information).",
          "type": "string",
          "pattern": "[0-9]+(\\.[0-9]+){3}"
        },
        "downloadUri": {
          "description": "The absolute URI from which the tool can be downloaded.",
          "type": "string",
          "format": "uri"
        },
        "sarifLoggerVersion": {
          "description": "A version that uniquely identifies the SARIF logging component that generated this file, if it is versioned separately from the tool.",
          "type": "string"
        },
        "language": {
          "description": "The tool language (expressed as an ISO 649 two-letter lowercase culture code) and region (expressed as an ISO 3166 two-letter uppercase subculture code associated with a country or region).",
          "type": "string",
          "default": "en-US"
        },
        "properties": {
          "description": "Key/value pairs that provide additional information about the tool.",
          "type": "object",
          "additionalProperties": true,
          "properties": {
            "tags": {
              "description": "A set of distinct strings that provide additional information.",
              "type": "array",
              "uniqueItems": true,
              "default": [],
              "items": {
                "type": "string"
              }
            }
          }
        }
      },
      "required": ["name"]
    },
    "versionControlDetails": {
      "description": "Specifies the information necessary to retrieve a desired revision from a version control system.",
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "uri": {
          "description": "The absolute URI of the repository.",
          "type": "string",
          "format": "uri"
        },
        "revisionId": {
          "description": "A string that uniquely and permanently identifies the revision within the repository.",
          "type": "string"
        },
        "branch": {
          "description": "The name of a branch containing the revision.",
          "type": "string"
        },
        "tag": {
          "description": "A tag that has been applied to the revision.",
          "type": "string"
        },
        "timestamp": {
          "description": "The date and time at which the revision was created.",
          "type": "string",
          "format": "date-time"
        },
        "properties": {
          "description": "Key/value pairs that provide additional information about the revision.",
          "type": "object",
          "additionalProperties": true,
          "properties": {
            "tags": {
              "description": "A set of distinct strings that provide additional information.",
              "type": "array",
              "uniqueItems": true,
              "default": [],
              "items": {
                "type": "string"
              }
            }
          }
        }
      },
      "required": ["uri"]
    }
  },
  "description": "Static Analysis Results Format (SARIF) Version 2.0.0 JSON Schema: a standard format for the output of static analysis tools.",
  "id": "https://json.schemastore.org/sarif-2.0.0.json",
  "properties": {
    "$schema": {
      "description": "The URI of the JSON schema corresponding to the version.",
      "type": "string",
      "format": "uri"
    },
    "version": {
      "description": "The SARIF format version of this log file.",
      "enum": ["2.0.0"]
    },
    "runs": {
      "description": "The set of runs contained in this log file.",
      "type": "array",
      "minItems": 1,
      "items": {
        "$ref": "#/definitions/run"
      }
    }
  },
  "required": ["version", "runs"],
  "title": "Static Analysis Results Format (SARIF) Version 2.0.0 JSON Schema",
  "type": "object"
}
