PS: Add reads of environment variables as local flow sources.

This commit is contained in:
Mathias Vorreiter Pedersen
2024-11-08 15:01:18 +00:00
parent 9f0f0ca8a4
commit 4a2fd527ed
3 changed files with 30 additions and 0 deletions

View File

@@ -273,6 +273,21 @@ class LocalVariable extends AbstractLocalScopeVariable, TLocalVariable {
final override Scope getDeclaringScope() { result = scope }
}
/**
* A variable of the form `$Env:HOME`.
*/
class EnvVariable extends Variable {
string var;
EnvVariable() { this.getName() = ["env:", "Env:"] + var }
/**
* Gets the part of the variable name that represens which environment
* variable.
*/
string getEnvironmentVariable() { result = var }
}
class Parameter extends AbstractLocalScopeVariable, TParameter {
ParameterImpl p;

View File

@@ -48,3 +48,12 @@ class VarWriteAccess extends VarAccess {
predicate isImplicit() { isImplicitVariableWriteAccess(this) }
}
/** An access to an environment variable such as `$Env:PATH` */
class EnvVarAccess extends VarAccess {
EnvVarAccess() { super.getVariable() instanceof EnvVariable }
override EnvVariable getVariable() { result = super.getVariable() }
string getEnvironmentVariable() { result = this.getVariable().getEnvironmentVariable() }
}

View File

@@ -30,6 +30,12 @@ abstract class EnvironmentVariableSource extends LocalFlowSource {
override string getSourceType() { result = "environment variable" }
}
private class EnvironmentVariableEnv extends EnvironmentVariableSource {
EnvironmentVariableEnv() {
this.asExpr().getExpr().(VarReadAccess).getVariable() instanceof EnvVariable
}
}
private class ExternalEnvironmentVariableSource extends EnvironmentVariableSource {
ExternalEnvironmentVariableSource() {
this = ModelOutput::getASourceNode("environment", _).asSource()