Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -118,8 +118,8 @@ ISymbol constantAttribute
return;
}

// Argument is a constant value, so do nothing
if( argument.Value.ConstantValue.HasValue ) {
// Argument is a constant value or string.Empty, so do nothing
if( argument.Value.ConstantValue.HasValue || IsStringEmpty( argument.Value ) ) {
return;
}

Expand Down Expand Up @@ -157,9 +157,9 @@ INamedTypeSymbol constantAttribute
return;
}

// Operand is a constant value, so trust it
// Operand is a constant value or string.Empty, so trust it
IOperation operand = conversion.Operand;
if( operand.ConstantValue.HasValue ) {
if( operand.ConstantValue.HasValue || IsStringEmpty( operand ) ) {
return;
}

Expand Down Expand Up @@ -216,6 +216,14 @@ ISymbol attributeSymbol
);
}

private static bool IsStringEmpty( IOperation operation ) {
if( operation is IFieldReferenceOperation fieldRef ) {
return fieldRef.Field.ContainingType.SpecialType == SpecialType.System_String
&& fieldRef.Field.Name == "Empty";
}
return false;
}

private static bool TypeCanBeConstant( SpecialType specialType ) {
switch( specialType ) {
case SpecialType.System_Enum:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ void Method() {

Logger.Error( CONSTANT_MESSAGE );
Logger.Error( "Organization 1 is constant." );
Logger.Error( string.Empty );
Logger.Error( /* NonConstantPassedToConstantParameter(message) */ string.Format(CONSTANT_MESSAGE, orgId) /**/ );
Logger.Error( /* NonConstantPassedToConstantParameter(message) */ $"Organization {orgId} is not constant." /**/ );

Expand All @@ -94,12 +95,14 @@ void Method() {
Types.SomeMethodWithConstantParameter<string>( "This is a constant message" );
Types.SomeMethodWithConstantParameter<string>( CONSTANT_STR );
Types.SomeMethodWithConstantParameter<string>( CONSTANT_STR + "This is a constant message" );
Types.SomeMethodWithConstantParameter<string>( string.Empty );
Types.SomeMethodWithConstantParameter<string>( /* NonConstantPassedToConstantParameter(param1) */ CONSTANT_STR + variableStr /**/ );
Types.SomeMethodWithConstantParameter<string>( /* NonConstantPassedToConstantParameter(param1) */ variableStr /**/ );

Types.SomeMethodWithParameter<string>( "This is a constant message" );
Types.SomeMethodWithParameter<string>( CONSTANT_STR );
Types.SomeMethodWithParameter<string>( CONSTANT_STR + "This is a constant message" );
Types.SomeMethodWithConstantParameter<string>( string.Empty );
Types.SomeMethodWithParameter<string>( CONSTANT_STR + variableStr );
Types.SomeMethodWithParameter<string>( variableStr );

Expand Down Expand Up @@ -212,13 +215,15 @@ string untrusted
string variable = "bar";

new Types.ConstantStruct( "abc" );
new Types.ConstantStruct( string.Empty );
new Types.ConstantStruct( Constants.String );
new Types.ConstantStruct( constant );
new Types.ConstantStruct( trusted );
new Types.ConstantStruct( /* NonConstantPassedToConstantParameter(value) */ variable /**/ );
new Types.ConstantStruct( /* NonConstantPassedToConstantParameter(value) */ untrusted /**/ );

new Types.NonConstantStruct( "abc" );
new Types.NonConstantStruct( string.Empty );
new Types.NonConstantStruct( Constants.String );
new Types.NonConstantStruct( constant );
new Types.NonConstantStruct( trusted );
Expand Down Expand Up @@ -264,13 +269,15 @@ string untrusted
string variable = "bar";

{ Types.ConstantStruct v = "abc"; }
{ Types.ConstantStruct v = string.Empty; }
{ Types.ConstantStruct v = Constants.String; }
{ Types.ConstantStruct v = constant; }
{ Types.ConstantStruct v = trusted; }
{ Types.ConstantStruct v = /* NonConstantPassedToConstantParameter(value) */ variable /**/; }
{ Types.ConstantStruct v = /* NonConstantPassedToConstantParameter(value) */ untrusted /**/; }

{ Types.NonConstantStruct v = "abc"; }
{ Types.NonConstantStruct v = string.Empty; }
{ Types.NonConstantStruct v = Constants.String; }
{ Types.NonConstantStruct v = constant; }
{ Types.NonConstantStruct v = trusted; }
Expand Down
Loading