Skip to content

Commit

Permalink
Expose whether a PointerVal has nullability properties.
Browse files Browse the repository at this point in the history
Also remove unused parameter of getPointerNullState.

PiperOrigin-RevId: 533139747
  • Loading branch information
Googler authored and copybara-github committed May 18, 2023
1 parent 0fe5825 commit f164e03
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 10 deletions.
9 changes: 7 additions & 2 deletions nullability/pointer_nullability.cc
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,13 @@ PointerValue* getPointerValueFromExpr(const Expr* PointerExpr,
Env.getValue(*PointerExpr, SkipPast::Reference));
}

bool hasPointerNullState(const dataflow::PointerValue& PointerVal) {
return PointerVal.getProperty(kKnown) != nullptr &&
PointerVal.getProperty(kNull) != nullptr;
}

std::pair<AtomicBoolValue&, AtomicBoolValue&> getPointerNullState(
const PointerValue& PointerVal, const Environment& Env) {
const PointerValue& PointerVal) {
auto& PointerKnown = *cast<AtomicBoolValue>(PointerVal.getProperty(kKnown));
auto& PointerNull = *cast<AtomicBoolValue>(PointerVal.getProperty(kNull));
return {PointerKnown, PointerNull};
Expand All @@ -61,7 +66,7 @@ void initPointerNullState(PointerValue& PointerVal, Environment& Env,
}

bool isNullable(const PointerValue& PointerVal, const Environment& Env) {
auto [PointerKnown, PointerNull] = getPointerNullState(PointerVal, Env);
auto [PointerKnown, PointerNull] = getPointerNullState(PointerVal);
auto& PointerNotKnownNull =
Env.makeNot(Env.makeAnd(PointerKnown, PointerNull));
return !Env.flowConditionImplies(PointerNotKnownNull);
Expand Down
13 changes: 11 additions & 2 deletions nullability/pointer_nullability.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,22 @@ namespace nullability {
dataflow::PointerValue* getPointerValueFromExpr(
const Expr* PointerExpr, const dataflow::Environment& Env);

// Returns true if the pointer has all properties necessary for representing
// complete nullness information.
// Otherwise, returns false.
//
// Pointers that are the value of some expression always have null state once
// that expression has been analyzed. Other pointers, like the values of unused
// parameters, may lack this state. This state is only set by
// PointerNullabilityAnalysis, not by the dataflow framework.
bool hasPointerNullState(const dataflow::PointerValue& PointerVal);

/// Returns the properties representing the nullness information of a pointer.
///
/// The first boolean indicates if the pointer's nullability is known.
/// The second boolean indicates if the pointer's value is null.
std::pair<dataflow::AtomicBoolValue&, dataflow::AtomicBoolValue&>
getPointerNullState(const dataflow::PointerValue& PointerVal,
const dataflow::Environment& Env);
getPointerNullState(const dataflow::PointerValue& PointerVal);

/// Sets the nullness properties on `PointerVal` if not already initialised.
///
Expand Down
11 changes: 5 additions & 6 deletions nullability/pointer_nullability_analysis.cc
Original file line number Diff line number Diff line change
Expand Up @@ -298,8 +298,8 @@ void transferFlowSensitiveNullCheckComparison(

if (!LHS || !RHS) return;

auto [LHSKnown, LHSNull] = getPointerNullState(*LHS, State.Env);
auto [RHSKnown, RHSNull] = getPointerNullState(*RHS, State.Env);
auto [LHSKnown, LHSNull] = getPointerNullState(*LHS);
auto [RHSKnown, RHSNull] = getPointerNullState(*RHS);
auto& LHSKnownNotNull =
State.Env.makeAnd(LHSKnown, State.Env.makeNot(LHSNull));
auto& RHSKnownNotNull =
Expand All @@ -325,8 +325,7 @@ void transferFlowSensitiveNullCheckImplicitCastPtrToBool(
getPointerValueFromExpr(CastExpr->IgnoreImplicit(), State.Env);
if (!PointerVal) return;

auto [PointerKnown, PointerNull] =
getPointerNullState(*PointerVal, State.Env);
auto [PointerKnown, PointerNull] = getPointerNullState(*PointerVal);
auto& CastExprLoc = State.Env.createStorageLocation(*CastExpr);
State.Env.setValue(CastExprLoc, State.Env.makeNot(PointerNull));
State.Env.setStorageLocation(*CastExpr, CastExprLoc);
Expand Down Expand Up @@ -726,8 +725,8 @@ bool PointerNullabilityAnalysis::merge(QualType Type, const Value& Val1,
return false;
}

auto [Known1, Null1] = getPointerNullState(cast<PointerValue>(Val1), Env1);
auto [Known2, Null2] = getPointerNullState(cast<PointerValue>(Val2), Env2);
auto [Known1, Null1] = getPointerNullState(cast<PointerValue>(Val1));
auto [Known2, Null2] = getPointerNullState(cast<PointerValue>(Val2));

auto& Known = mergeBoolValues(Known1, Env1, Known2, Env2, MergedEnv);
auto& Null = mergeBoolValues(Null1, Env1, Null2, Env2, MergedEnv);
Expand Down

0 comments on commit f164e03

Please sign in to comment.