25. ساخت طریق از درستی:مختلف رویکرد سه
17مه17
Specification Implementation
Specification Implementation
انتزاع واقعیت
Specification Implementation
Human Guided
Synthesis
Human Created Refinement
and Proof
Human Created Synthesis
and Static Analysis
Synthesis
E.g. Simulink
Refinement
E.g. B
Analysis
E.g. SPARK
سازی پیاده در افزار نرم خطاهای از اجتناب-ذاکری مرتضی 25از68
31. برنامه کلی تصویرSPARK
17مه17
Notation For
Annotations
Language With Precise
Syntax & Semantics
Tools—Applied
During
Development
Properties
Correctness by
construction
Compiler
Linker
Loader
Executable
Software
Software
Ada + Annotations
سازی پیاده در افزار نرم خطاهای از اجتناب-ذاکری مرتضی 31از68
32. در توسعه فرایندSPARK
17مه17
Develop Incremental Change
To Software
Check Changes Using SPARK
Tools
Partially Complete Software
System
Develop or enhance the
annotations to reflect
incremental change in
specification and then
develop or enhance
software to implement
specification documented
by annotations
Complete?
No
Yes
Software Specification High/low Level Designs
سازی پیاده در افزار نرم خطاهای از اجتناب-ذاکری مرتضی 32از68
33. در تحلیلSPARK
17مه17
Software
Source + Annotations
Syntax
Analysis
Type
Analysis
Data Flow
Analysis
Control Flow
Analysis
Functional
Correctness
Low Level Design
Annotations
Compiler Examiner
Simplifier
&
Prover
Not the high-level (Z) specification!
سازی پیاده در افزار نرم خطاهای از اجتناب-ذاکری مرتضی 33از68
40. ساده مثال یک
17مه17
1. package simpleadd is
2. procedure sum (X,Y : in Integer; Z : out Integer);
3. --# derives Z from X, Y;
4. --# pre (X > 1) and (X < 1000) and (Y > 1) and (Y < 1000);
5. --# post Z=X+Y;
6. end simpleadd;
7. package body simpleadd is
8. procedure sum (X,Y : in Integer; Z : out Integer) is
9. begin
10. if (X > 1) and (X < 1000) and (Y > 1) and (Y < 1000) then
11. Z := X;
12. for i in Integer range 1..Y loop
13. Z := Z + 1;
14. --# assert Z = X + i and Y = Y%;
15. end loop;
16. else
17. Z := 0;
18. end if;
19. end sum;
20. end simpleadd;
سازی پیاده در افزار نرم خطاهای از اجتناب-ذاکری مرتضی 40از68
41. درستی شرط1
17مه17
1. For path(s) from start to run-time check associated with statement of line 6:
2. procedure_sum_1.
3. H1: x > 1 .
4. H2: x < 1000 .
5. H3: y > 1 .
6. H4: y < 1000 .
7. H5: x >= integer__first .
8. H6: x <= integer__last .
9. H7: y >= integer__first .
10. H8: y <= integer__last .
11. H9: x > 1 .
12. H10: x < 1000 .
13. H11: y > 1 .
14. H12: y < 1000 .
15. ->
16. C1: x >= integer__first .
17. C2: x <= integer__last .
سازی پیاده در افزار نرم خطاهای از اجتناب-ذاکری مرتضی 41از68
55. ها نویسی حاشیه خالصه
17مه17
package Temperature is
procedure ConvertFtoC(Fahrenheit : in Float;
Celsius : out Float);
procedure ConvertCtoF(Celsius : in Float;
Fahrenheit : out Float);
function GetTempC return Float;
--# global in Scale;
--# own TempKelvin;
--# initializes TempKelvin;
end Temperature;
package body Temperature is
TempKelvin : Float;
سازی پیاده در افزار نرم خطاهای از اجتناب-ذاکری مرتضی 55از68
56. ها نویسی حاشیه خالصه
--# preو--# post
معنایمتداولپیششرطهاوپسشرطها
نیازبهعالمتهای:
~برایمقدارقبلی
%برایمقدارثابت
سورها:for all،for some
همهگزارههایمنطقیوریاضیمعمولراداریم.
حاشیهنویسیامکانتعریفمشخصههای
عملیاتیرامیدهدوابزارهایSPARKامکان
اثباتدرستیمشخصههابهصورتخودکاررا
فراهممیآورند.
17مه17
procedure Swap(X,Y : in out Integer);
--# derives X from Y &
--# Y from X;
--# post X = Y~ & Y = X~;
is
T : Integer;
begin
T := X; X := Y; Y := T;
end Swap;
سازی پیاده در افزار نرم خطاهای از اجتناب-ذاکری مرتضی 56از68
58. از مثالینامتغیرحلقه
صحیح تقسیم ساده برنامهx / y:
حلقه از مستقل مقدار:
x = q*y + r r >= 0
،تکرار بار صفر برای فوق عبارت
تکرار بار یک
است درست تکرار بار هر تعداد و(حلقه اجرای از بعد و قبل.)
17مه17
q := 0
r := x;
loop
exit when r < y;
q := q + 1;
r := r – y;
end loop;
سازی پیاده در افزار نرم خطاهای از اجتناب-ذاکری مرتضی 58از68
59. ها نویسی حاشیه خالصه
17مه17
package Divide is
procedure IntDivide (X,Y : in Integer; R, Q : out Integer);
--# derives R, Q from X, Y;
--# pre (X >= 0) and (Y > 0);
--# post (X = Q * Y + R) and (R >= 0) and (R < Y);
end IntDivide;
package body Divide is
procedure IntDivide (X,Y : in Integer; R, Q : out Integer) is
begin
Q := 0;
R := X;
loop
--# assert (X = Q*Y + R) and (R >= 0);
exit when R < Y;
Q := Q + 1;
R := R - Y;
end loop;
end IntDivide;
end Divide;
سازی پیاده در افزار نرم خطاهای از اجتناب-ذاکری مرتضی 59از68