nyx/src/symbol/mod.rs

95 lines
2.6 KiB
Rust
Raw Normal View History

Feat/full cfg (#30) * feat: Enhance control flow analysis with function summaries and taint analysis * feat: Update taint analysis to utilize function summaries for enhanced tracking * Refactor `walk.rs` batch processing and override handling: - Renamed `Batcher` to `BatchSender` for clarity. - Added `BatchSender::new` constructor for cleaner initialization. - Simplified batch size management in `BatchSender`. - Extracted `build_overrides` function for reusable override construction. - Improved error handling and validation in override building. - Enhanced performance with directory and file type filtering in `walk`. * Improve logging and streamline directory walk process: - Added detailed `tracing` logs for debugging batch flushes, override construction, and walk initialization/completion. - Optimized and simplified `filter_entry` logic for directory and file type filters. - Improved metadata checks and max file size enforcement during the scan. * Refactor and optimize taint tracking, label rules, and directory walk process: - Replaced `DefaultHasher` with `blake3::Hasher` for improved taint hashing. - Enhanced sorting and hashing logic in `taint.rs` for consistency and efficiency. - Removed unused `set_hash` function and redundant imports across files. - Improved batch sender logic in `walk.rs`, renaming key components for clarity. - Unified `spawn_senders` and `spawn_file_walker` with thread handling and channel tuple return. - Expanded label rules with additional matchers for sources, sanitizers, and sinks. - Deprecated `dump_cfg` and specific logging utilities in `cfg.rs` for code cleanup. * fix: fixed let chains error in walk.rs * fix: updated dependencies * fix: updated dependencies * chore: Remove standard error in scan.rs * feat: Introduce function summaries for enhanced taint and control flow analysis * feat: Enhance taint analysis with interop support and function summaries * feat: Add configuration analysis module and enhance matcher rules * feat: Add arity column to function_summaries and handle schema migration * fix: fixed clippy &PathBuf warnings * chore: Update dependencies and versioning in Cargo files * docs: Update README to enhance clarity and detail on features and analysis modes * chore: Update CHANGELOG for version 0.2.0 with new features, changes, and fixes * docs: Update SECURITY.md to clarify version support status --------- Co-authored-by: elipeter <eli.peter@es.fcm.travel>
2026-02-24 23:44:07 -05:00
use serde::{Deserialize, Serialize};
use std::fmt;
/// Supported source-code languages.
#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, Serialize, Deserialize)]
pub enum Lang {
Rust,
C,
Cpp,
Java,
Go,
Php,
Python,
Ruby,
TypeScript,
JavaScript,
}
impl Lang {
/// Parse a language slug (as returned by `lang_for_path`) into a `Lang`.
pub fn from_slug(s: &str) -> Option<Lang> {
match s {
"rust" => Some(Lang::Rust),
"c" => Some(Lang::C),
"cpp" => Some(Lang::Cpp),
"java" => Some(Lang::Java),
"go" => Some(Lang::Go),
"php" => Some(Lang::Php),
"python" => Some(Lang::Python),
"ruby" => Some(Lang::Ruby),
"typescript" | "ts" => Some(Lang::TypeScript),
"javascript" | "js" => Some(Lang::JavaScript),
_ => None,
}
}
/// Canonical slug string for this language.
pub fn as_str(&self) -> &'static str {
match self {
Lang::Rust => "rust",
Lang::C => "c",
Lang::Cpp => "cpp",
Lang::Java => "java",
Lang::Go => "go",
Lang::Php => "php",
Lang::Python => "python",
Lang::Ruby => "ruby",
Lang::TypeScript => "typescript",
Lang::JavaScript => "javascript",
}
}
}
impl fmt::Display for Lang {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(self.as_str())
}
}
/// Uniquely identifies a function across the entire project.
#[derive(Clone, Debug, Hash, PartialEq, Eq, Serialize, Deserialize)]
pub struct FuncKey {
pub lang: Lang,
/// Project-relative file path (e.g. `"src/lib.rs"`).
pub namespace: String,
pub name: String,
pub arity: Option<usize>,
}
impl fmt::Display for FuncKey {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}::{}::{}", self.lang, self.namespace, self.name)?;
if let Some(a) = self.arity {
write!(f, "/{a}")?;
}
Ok(())
}
}
/// Strip `root` prefix from `abs_path` to produce a stable project-relative path.
///
/// Falls back to the full path if stripping fails (e.g. in tests with synthetic paths).
pub fn normalize_namespace(abs_path: &str, root: Option<&str>) -> String {
if let Some(r) = root {
let r = r.trim_end_matches('/');
if let Some(rest) = abs_path.strip_prefix(r) {
return rest.trim_start_matches('/').to_string();
}
}
abs_path.to_string()
}
#[cfg(test)]
mod tests;