in source/Model.cpp [1048:1203]
Json::Value Model::to_json() const {
auto value = Json::Value(Json::objectValue);
if (method_) {
value["method"] = method_->to_json();
}
if (modes_) {
auto modes = Json::Value(Json::arrayValue);
for (auto mode : k_all_modes) {
if (modes_.test(mode)) {
modes.append(Json::Value(model_mode_to_string(mode)));
}
}
value["modes"] = modes;
}
if (!generations_.is_bottom()) {
auto generations_value = Json::Value(Json::arrayValue);
for (const auto& [port, generation_taint] : generations_.elements()) {
for (const auto& generations : generation_taint) {
for (const auto& generation : generations) {
mt_assert(!generation.is_bottom());
auto generation_value = generation.to_json();
generation_value["caller_port"] = port.to_json();
generations_value.append(generation_value);
}
}
}
value["generations"] = generations_value;
}
if (!parameter_sources_.is_bottom()) {
auto parameter_sources_value = Json::Value(Json::arrayValue);
for (const auto& [port, parameter_source_taint] :
parameter_sources_.elements()) {
for (const auto& parameter_sources : parameter_source_taint) {
for (const auto& parameter_source : parameter_sources) {
mt_assert(!parameter_source.is_bottom());
auto parameter_source_value = parameter_source.to_json();
parameter_source_value["caller_port"] = port.to_json();
parameter_sources_value.append(parameter_source_value);
}
}
}
value["parameter_sources"] = parameter_sources_value;
}
if (!sinks_.is_bottom()) {
auto sinks_value = Json::Value(Json::arrayValue);
for (const auto& [port, sink_taint] : sinks_.elements()) {
for (const auto& sinks : sink_taint) {
for (const auto& sink : sinks) {
mt_assert(!sink.is_bottom());
auto sink_value = sink.to_json();
sink_value["caller_port"] = port.to_json();
sinks_value.append(sink_value);
}
}
}
value["sinks"] = sinks_value;
}
if (!propagations_.is_bottom()) {
auto propagations_value = Json::Value(Json::arrayValue);
for (const auto& [output, propagations] : propagations_.elements()) {
for (const auto& propagation : propagations) {
auto propagation_value = propagation.to_json();
propagation_value["output"] = output.to_json();
propagations_value.append(propagation_value);
}
}
value["propagation"] = propagations_value;
}
auto sanitizers_value = Json::Value(Json::arrayValue);
for (const auto& sanitizer : global_sanitizers_) {
if (!sanitizer.is_bottom()) {
sanitizers_value.append(sanitizer.to_json());
}
}
for (const auto& [root, sanitizers] : port_sanitizers_) {
auto root_value = root.to_json();
for (const auto& sanitizer : sanitizers) {
if (!sanitizer.is_bottom()) {
auto sanitizer_value = sanitizer.to_json();
sanitizer_value["port"] = root_value;
sanitizers_value.append(sanitizer_value);
}
}
}
if (!sanitizers_value.empty()) {
value["sanitizers"] = sanitizers_value;
}
if (!attach_to_sources_.is_bottom()) {
auto attach_to_sources_value = Json::Value(Json::arrayValue);
for (const auto& [root, features] : attach_to_sources_) {
auto attach_to_sources_root_value = Json::Value(Json::objectValue);
attach_to_sources_root_value["port"] = root.to_json();
attach_to_sources_root_value["features"] = features.to_json();
attach_to_sources_value.append(attach_to_sources_root_value);
}
value["attach_to_sources"] = attach_to_sources_value;
}
if (!attach_to_sinks_.is_bottom()) {
auto attach_to_sinks_value = Json::Value(Json::arrayValue);
for (const auto& [root, features] : attach_to_sinks_) {
auto attach_to_sinks_root_value = Json::Value(Json::objectValue);
attach_to_sinks_root_value["port"] = root.to_json();
attach_to_sinks_root_value["features"] = features.to_json();
attach_to_sinks_value.append(attach_to_sinks_root_value);
}
value["attach_to_sinks"] = attach_to_sinks_value;
}
if (!attach_to_propagations_.is_bottom()) {
auto attach_to_propagations_value = Json::Value(Json::arrayValue);
for (const auto& [root, features] : attach_to_propagations_) {
auto attach_to_propagations_root_value = Json::Value(Json::objectValue);
attach_to_propagations_root_value["port"] = root.to_json();
attach_to_propagations_root_value["features"] = features.to_json();
attach_to_propagations_value.append(attach_to_propagations_root_value);
}
value["attach_to_propagations"] = attach_to_propagations_value;
}
if (!add_features_to_arguments_.is_bottom()) {
auto add_features_to_arguments_value = Json::Value(Json::arrayValue);
for (const auto& [root, features] : add_features_to_arguments_) {
auto add_features_to_arguments_root_value =
Json::Value(Json::objectValue);
add_features_to_arguments_root_value["port"] = root.to_json();
add_features_to_arguments_root_value["features"] = features.to_json();
add_features_to_arguments_value.append(
add_features_to_arguments_root_value);
}
value["add_features_to_arguments"] = add_features_to_arguments_value;
}
if (auto access_path = inline_as_.get_constant()) {
value["inline_as"] = access_path->to_json();
}
if (!issues_.is_bottom()) {
auto issues_value = Json::Value(Json::arrayValue);
for (const auto& issue : issues_) {
mt_assert(!issue.is_bottom());
issues_value.append(issue.to_json());
}
value["issues"] = issues_value;
}
return value;
}