MCPcopy Create free account
hub / github.com/FuzzAnything/PromptFuzz / get_rvalue

Method get_rvalue

src/analysis/dfa.rs:228–309  ·  view source on GitHub ↗

get the value of the Right Hand Expression

(&mut self, stmt: &ast::Node)

Source from the content-addressed store, hash-verified

226
227 /// get the value of the Right Hand Expression
228 fn get_rvalue(&mut self, stmt: &ast::Node) -> Result<Symbol<T>> {
229 let stmt = stmt.ignore_cast().ignore_parent().ignore_cast();
230 let sym = match &stmt.kind {
231 ast::Clang::CallExpr(_) => {
232 (self.callback.precall)(&mut self.store_mgr, &mut self.env_mgr, stmt);
233 let mut sym = self.env_mgr.create_object_for_call(stmt)?;
234 (self.callback.postcall)(&mut self.store_mgr, stmt, &mut sym);
235 sym
236 }
237 ast::Clang::CharacterLiteral(_)
238 | ast::Clang::StringLiteral(_)
239 | ast::Clang::IntegerLiteral(_)
240 | ast::Clang::FloatingLiteral(_) => self.env_mgr.create_object_from_literal(stmt)?,
241 ast::Clang::ParenExpr(_) => {
242 assert!(!stmt.inner.is_empty());
243 if stmt.inner.len() == 1 {
244 let child = stmt.inner.first().unwrap();
245 self.get_rvalue(child)?
246 } else {
247 self.env_mgr.create_dummy_object()
248 }
249 }
250 ast::Clang::DeclRefExpr(_) => {
251 let var = stmt.get_var_name();
252 if let Ok(sym) = self.store_mgr.get_bind(&var) {
253 sym
254 } else {
255 self.env_mgr.create_dummy_object()
256 }
257 }
258 ast::Clang::InitListExpr(il) => {
259 let ty = il.get_type();
260 self.env_mgr.create_list_object(ty)
261 }
262 ast::Clang::BinaryOperator(bo) => {
263 if bo.is_assignment() {
264 let left = bo.get_lhs(stmt);
265 let right = bo.get_rhs(stmt);
266 let var = left.get_var_name();
267 let sym = self.get_rvalue(right)?;
268 self.store_mgr.ssa_bind_value(var, sym.clone())?;
269 sym
270 } else {
271 self.env_mgr.create_dummy_object()
272 }
273 }
274 ast::Clang::ArraySubscriptExpr(ase) => {
275 let lhs = ase.get_lhs(stmt).ignore_cast().ignore_parent();
276 if let ast::Clang::DeclRefExpr(_) = &lhs.kind {
277 self.get_rvalue(lhs)?
278 } else if let ast::Clang::CallExpr(_) = &lhs.kind {
279 self.get_rvalue(lhs)?
280 } else {
281 //log::warn!("getRValue is unimplemented for : {stmt:#?}");
282 self.env_mgr.create_dummy_object()
283 }
284 }
285 ast::Clang::MemberExpr(me) => {

Callers 2

visit_var_declMethod · 0.80
visit_binary_operatorMethod · 0.80

Calls 14

ignore_castMethod · 0.80
ignore_parentMethod · 0.80
create_dummy_objectMethod · 0.80
get_var_nameMethod · 0.80
get_bindMethod · 0.80
get_typeMethod · 0.80
create_list_objectMethod · 0.80
is_assignmentMethod · 0.80
get_lhsMethod · 0.80
get_rhsMethod · 0.80

Tested by

no test coverage detected