mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-12 09:46:12 +02:00
fcl-passrc: resolver: range check on: warnings becomes errors
git-svn-id: trunk@38828 -
This commit is contained in:
parent
fcfe99d505
commit
e6513d6883
@ -235,7 +235,7 @@ resourcestring
|
|||||||
sSymbolXIsDeprecatedY = 'Symbol "%s" is deprecated: %s';
|
sSymbolXIsDeprecatedY = 'Symbol "%s" is deprecated: %s';
|
||||||
sRangeCheckError = 'Range check error';
|
sRangeCheckError = 'Range check error';
|
||||||
sHighRangeLimitLTLowRangeLimit = 'High range limit < low range limit';
|
sHighRangeLimitLTLowRangeLimit = 'High range limit < low range limit';
|
||||||
sRangeCheckEvaluatingConstantsVMinMax = 'range check error while evaluating constants (%s must be between %s and %s)';
|
sRangeCheckEvaluatingConstantsVMinMax = 'range check error while evaluating constants (%s is not between %s and %s)';
|
||||||
sIllegalChar = 'Illegal character';
|
sIllegalChar = 'Illegal character';
|
||||||
sOverflowInArithmeticOperation = 'Overflow in arithmetic operation';
|
sOverflowInArithmeticOperation = 'Overflow in arithmetic operation';
|
||||||
sDivByZero = 'Division by zero';
|
sDivByZero = 'Division by zero';
|
||||||
@ -552,6 +552,8 @@ type
|
|||||||
Expr: TPrimitiveExpr; Flags: TResEvalFlags): TResEvalValue of object;
|
Expr: TPrimitiveExpr; Flags: TResEvalFlags): TResEvalValue of object;
|
||||||
TPasResEvalParamsHandler = function(Sender: TResExprEvaluator;
|
TPasResEvalParamsHandler = function(Sender: TResExprEvaluator;
|
||||||
Params: TParamsExpr; Flags: TResEvalFlags): TResEvalValue of object;
|
Params: TParamsExpr; Flags: TResEvalFlags): TResEvalValue of object;
|
||||||
|
TPasResEvalRangeCheckElHandler = procedure(Sender: TResExprEvaluator;
|
||||||
|
El: TPasElement; var MsgType: TMessageType) of object;
|
||||||
|
|
||||||
{ TResExprEvaluator }
|
{ TResExprEvaluator }
|
||||||
|
|
||||||
@ -562,6 +564,7 @@ type
|
|||||||
FOnEvalIdentifier: TPasResEvalIdentHandler;
|
FOnEvalIdentifier: TPasResEvalIdentHandler;
|
||||||
FOnEvalParams: TPasResEvalParamsHandler;
|
FOnEvalParams: TPasResEvalParamsHandler;
|
||||||
FOnLog: TPasResEvalLogHandler;
|
FOnLog: TPasResEvalLogHandler;
|
||||||
|
FOnRangeCheckEl: TPasResEvalRangeCheckElHandler;
|
||||||
protected
|
protected
|
||||||
procedure LogMsg(const id: int64; MsgType: TMessageType; MsgNumber: integer;
|
procedure LogMsg(const id: int64; MsgType: TMessageType; MsgNumber: integer;
|
||||||
const Fmt: String; Args: Array of const; PosEl: TPasElement); overload;
|
const Fmt: String; Args: Array of const; PosEl: TPasElement); overload;
|
||||||
@ -638,6 +641,7 @@ type
|
|||||||
property OnLog: TPasResEvalLogHandler read FOnLog write FOnLog;
|
property OnLog: TPasResEvalLogHandler read FOnLog write FOnLog;
|
||||||
property OnEvalIdentifier: TPasResEvalIdentHandler read FOnEvalIdentifier write FOnEvalIdentifier;
|
property OnEvalIdentifier: TPasResEvalIdentHandler read FOnEvalIdentifier write FOnEvalIdentifier;
|
||||||
property OnEvalParams: TPasResEvalParamsHandler read FOnEvalParams write FOnEvalParams;
|
property OnEvalParams: TPasResEvalParamsHandler read FOnEvalParams write FOnEvalParams;
|
||||||
|
property OnRangeCheckEl: TPasResEvalRangeCheckElHandler read FOnRangeCheckEl write FOnRangeCheckEl;
|
||||||
property AllowedInts: TResEvalTypedInts read FAllowedInts write FAllowedInts;
|
property AllowedInts: TResEvalTypedInts read FAllowedInts write FAllowedInts;
|
||||||
property DefaultStringCodePage: TSystemCodePage read FDefaultEncoding write FDefaultEncoding;
|
property DefaultStringCodePage: TSystemCodePage read FDefaultEncoding write FDefaultEncoding;
|
||||||
end;
|
end;
|
||||||
@ -4352,6 +4356,8 @@ end;
|
|||||||
procedure TResExprEvaluator.EmitRangeCheckConst(id: int64; const aValue,
|
procedure TResExprEvaluator.EmitRangeCheckConst(id: int64; const aValue,
|
||||||
MinVal, MaxVal: String; PosEl: TPasElement; MsgType: TMessageType);
|
MinVal, MaxVal: String; PosEl: TPasElement; MsgType: TMessageType);
|
||||||
begin
|
begin
|
||||||
|
if Assigned(OnRangeCheckEl) then
|
||||||
|
OnRangeCheckEl(Self,PosEl,MsgType);
|
||||||
LogMsg(id,MsgType,nRangeCheckEvaluatingConstantsVMinMax,
|
LogMsg(id,MsgType,nRangeCheckEvaluatingConstantsVMinMax,
|
||||||
sRangeCheckEvaluatingConstantsVMinMax,[aValue,MinVal,MaxVal],PosEl);
|
sRangeCheckEvaluatingConstantsVMinMax,[aValue,MinVal,MaxVal],PosEl);
|
||||||
end;
|
end;
|
||||||
|
@ -1359,6 +1359,8 @@ type
|
|||||||
Expr: TPrimitiveExpr; Flags: TResEvalFlags): TResEvalValue; virtual;
|
Expr: TPrimitiveExpr; Flags: TResEvalFlags): TResEvalValue; virtual;
|
||||||
function OnExprEvalParams(Sender: TResExprEvaluator;
|
function OnExprEvalParams(Sender: TResExprEvaluator;
|
||||||
Params: TParamsExpr; Flags: TResEvalFlags): TResEvalValue; virtual;
|
Params: TParamsExpr; Flags: TResEvalFlags): TResEvalValue; virtual;
|
||||||
|
procedure OnRangeCheckEl(Sender: TResExprEvaluator; El: TPasElement;
|
||||||
|
var MsgType: TMessageType); virtual;
|
||||||
function EvalBaseTypeCast(Params: TParamsExpr; bt: TResolverBaseType): TResEvalvalue;
|
function EvalBaseTypeCast(Params: TParamsExpr; bt: TResolverBaseType): TResEvalvalue;
|
||||||
protected
|
protected
|
||||||
// custom types (added by descendant resolvers)
|
// custom types (added by descendant resolvers)
|
||||||
@ -10504,6 +10506,15 @@ begin
|
|||||||
if Flags=[] then ;
|
if Flags=[] then ;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TPasResolver.OnRangeCheckEl(Sender: TResExprEvaluator;
|
||||||
|
El: TPasElement; var MsgType: TMessageType);
|
||||||
|
begin
|
||||||
|
if El=nil then exit;
|
||||||
|
if (MsgType=mtWarning)
|
||||||
|
and (bsRangeChecks in CurrentParser.Scanner.CurrentBoolSwitches) then
|
||||||
|
MsgType:=mtError;
|
||||||
|
end;
|
||||||
|
|
||||||
function TPasResolver.EvalBaseTypeCast(Params: TParamsExpr;
|
function TPasResolver.EvalBaseTypeCast(Params: TParamsExpr;
|
||||||
bt: TResolverBaseType): TResEvalvalue;
|
bt: TResolverBaseType): TResEvalvalue;
|
||||||
|
|
||||||
@ -12158,6 +12169,7 @@ begin
|
|||||||
fExprEvaluator.OnLog:=@OnExprEvalLog;
|
fExprEvaluator.OnLog:=@OnExprEvalLog;
|
||||||
fExprEvaluator.OnEvalIdentifier:=@OnExprEvalIdentifier;
|
fExprEvaluator.OnEvalIdentifier:=@OnExprEvalIdentifier;
|
||||||
fExprEvaluator.OnEvalParams:=@OnExprEvalParams;
|
fExprEvaluator.OnEvalParams:=@OnExprEvalParams;
|
||||||
|
fExprEvaluator.OnRangeCheckEl:=@OnRangeCheckEl;
|
||||||
PushScope(FDefaultScope);
|
PushScope(FDefaultScope);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
@ -686,6 +686,7 @@ type
|
|||||||
|
|
||||||
// static arrays
|
// static arrays
|
||||||
Procedure TestArrayIntRange_OutOfRange;
|
Procedure TestArrayIntRange_OutOfRange;
|
||||||
|
Procedure TestArrayIntRange_OutOfRangeError;
|
||||||
Procedure TestArrayCharRange_OutOfRange;
|
Procedure TestArrayCharRange_OutOfRange;
|
||||||
|
|
||||||
// procedure types
|
// procedure types
|
||||||
@ -2813,7 +2814,7 @@ begin
|
|||||||
' i:=3;']);
|
' i:=3;']);
|
||||||
ParseProgram;
|
ParseProgram;
|
||||||
CheckResolverHint(mtWarning,nRangeCheckEvaluatingConstantsVMinMax,
|
CheckResolverHint(mtWarning,nRangeCheckEvaluatingConstantsVMinMax,
|
||||||
'range check error while evaluating constants (3 must be between 1 and 2)');
|
'range check error while evaluating constants (3 is not between 1 and 2)');
|
||||||
CheckResolverUnexpectedHints;
|
CheckResolverUnexpectedHints;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -2825,7 +2826,7 @@ begin
|
|||||||
'begin']);
|
'begin']);
|
||||||
ParseProgram;
|
ParseProgram;
|
||||||
CheckResolverHint(mtWarning,nRangeCheckEvaluatingConstantsVMinMax,
|
CheckResolverHint(mtWarning,nRangeCheckEvaluatingConstantsVMinMax,
|
||||||
'range check error while evaluating constants (300 must be between 0 and 255)');
|
'range check error while evaluating constants (300 is not between 0 and 255)');
|
||||||
CheckResolverUnexpectedHints;
|
CheckResolverUnexpectedHints;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -2848,7 +2849,7 @@ begin
|
|||||||
'begin']);
|
'begin']);
|
||||||
ParseProgram;
|
ParseProgram;
|
||||||
CheckResolverHint(mtWarning,nRangeCheckEvaluatingConstantsVMinMax,
|
CheckResolverHint(mtWarning,nRangeCheckEvaluatingConstantsVMinMax,
|
||||||
'range check error while evaluating constants (3 must be between 1 and 2)');
|
'range check error while evaluating constants (3 is not between 1 and 2)');
|
||||||
CheckResolverUnexpectedHints;
|
CheckResolverUnexpectedHints;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -11020,7 +11021,7 @@ begin
|
|||||||
Add('begin');
|
Add('begin');
|
||||||
ParseProgram;
|
ParseProgram;
|
||||||
CheckResolverHint(mtWarning,nRangeCheckEvaluatingConstantsVMinMax,
|
CheckResolverHint(mtWarning,nRangeCheckEvaluatingConstantsVMinMax,
|
||||||
'range check error while evaluating constants (300 must be between -128 and 127)');
|
'range check error while evaluating constants (300 is not between -128 and 127)');
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TTestResolver.TestArrayOfArray;
|
procedure TTestResolver.TestArrayOfArray;
|
||||||
@ -11669,10 +11670,24 @@ begin
|
|||||||
'']);
|
'']);
|
||||||
ParseProgram;
|
ParseProgram;
|
||||||
CheckResolverHint(mtWarning,nRangeCheckEvaluatingConstantsVMinMax,
|
CheckResolverHint(mtWarning,nRangeCheckEvaluatingConstantsVMinMax,
|
||||||
'range check error while evaluating constants (0 must be between 1 and 2)');
|
'range check error while evaluating constants (0 is not between 1 and 2)');
|
||||||
CheckResolverUnexpectedHints;
|
CheckResolverUnexpectedHints;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TTestResolver.TestArrayIntRange_OutOfRangeError;
|
||||||
|
begin
|
||||||
|
StartProgram(false);
|
||||||
|
Add([
|
||||||
|
'{$R+}',
|
||||||
|
'type TArr = array[1..2] of longint;',
|
||||||
|
'var a: TArr;',
|
||||||
|
'begin',
|
||||||
|
' a[0]:=3;',
|
||||||
|
'']);
|
||||||
|
CheckResolverException('range check error while evaluating constants (0 is not between 1 and 2)',
|
||||||
|
nRangeCheckEvaluatingConstantsVMinMax);
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TTestResolver.TestArrayCharRange_OutOfRange;
|
procedure TTestResolver.TestArrayCharRange_OutOfRange;
|
||||||
begin
|
begin
|
||||||
StartProgram(false);
|
StartProgram(false);
|
||||||
@ -11684,7 +11699,7 @@ begin
|
|||||||
'']);
|
'']);
|
||||||
ParseProgram;
|
ParseProgram;
|
||||||
CheckResolverHint(mtWarning,nRangeCheckEvaluatingConstantsVMinMax,
|
CheckResolverHint(mtWarning,nRangeCheckEvaluatingConstantsVMinMax,
|
||||||
'range check error while evaluating constants (''0'' must be between ''a'' and ''b'')');
|
'range check error while evaluating constants (''0'' is not between ''a'' and ''b'')');
|
||||||
CheckResolverUnexpectedHints;
|
CheckResolverUnexpectedHints;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user