pyrograph 0.1.0

GPU-accelerated taint analysis for supply chain malware detection
Documentation
use rustpython_parser::Parse;

use crate::error::{Error, Result};
use crate::ir::TaintGraph;
use crate::labels::LabelSet;

mod expr;
mod labels_default;
mod scope;
mod visitor;

use labels_default::{apply_labels, default_label_set};
use visitor::PythonParser;

/// Parse a single Python file into a taint graph with optional custom labels.
pub fn parse_python_with_labels(
    source: &str,
    filename: &str,
    labels: Option<&LabelSet>,
) -> Result<TaintGraph> {
    let suite = rustpython_parser::ast::Suite::parse(source, filename)
        .map_err(|e| Error::Analysis(e.to_string()))?;
    let mut parser = PythonParser::new();
    parser.parse_suite(&suite);
    let mut graph = parser.into_graph();
    let label_set = labels.map_or_else(default_label_set, Clone::clone);
    apply_labels(&mut graph, &label_set);
    graph.set_label_set(label_set);
    Ok(graph)
}

/// Parse a single Python file into a taint graph.
pub fn parse_python(source: &str, filename: &str) -> Result<TaintGraph> {
    parse_python_with_labels(source, filename, None)
}