Re: Fråga om Strängar.
Postat: 2 januari 2014, 00:48:03
Ja men meningen är ju att jag skall skriva något på displayen. Jag skickar ju inte en tom sträng för utskrift, det känns ju lite onödigt.
Svenskt forum för elektroniksnack.
https://elektronikforumet.com/forum/
Kod: Markera allt
$ type str_c.c
# include "stdio"
char *text [5];
void main()
{
*text = "ABCDEFGH\0";
printf("%s", *text);
}
$ cc str_c
$ link str_c
$ run str_c
ABCDEFGH
$
Kod: Markera allt
$ type str_c.c
# include "stdio"
char *text [5];
void main()
{
text[100000] = "A";
printf("%s", *text);
}
$ cc/nowarnings str_c
$ link str_c
$ run str_c
%SYSTEM-F-ACCVIO, access violation, reason mask=04, virtual address=0000000000091A80, PC=00000000000200C8, PS=0000001B
%TRACE-F-TRACEBACK, symbolic stack dump follows
image module routine line rel PC abs PC
STR_C STR_C main 1608 00000000000000C8 00000000000200C8
STR_C STR_C __main 1606 0000000000000064 0000000000020064
0 FFFFFFFF8038BC44 FFFFFFFF8038BC44
%TRACE-I-END, end of TRACE stack dump
$
Kod: Markera allt
$ type str_pas.pas
program str(output);
var
text : string(5);
begin
text := "ABCDE";
writeln(text);
end.
$ pas str_pas
$ link str_pas
$ run str_pas
ABCDE
$
Kod: Markera allt
$ type str_pas.pas
program str(output);
var
text : string(5);
begin
text := "ABCDEF";
writeln(text);
end.
$ pas str_pas
$ link str_pas
$ run str_pas
%PAS-F-STRASGLEN, string assignment length error
%TRACE-F-TRACEBACK, symbolic stack dump follows
image module routine line rel PC abs PC
STR_PAS STR STR 5 00000000000000C8 00000000000200C8
0 FFFFFFFF8038BC44 FFFFFFFF8038BC44
%TRACE-I-END, end of TRACE stack dump
$
Kod: Markera allt
STRASGLEN, string assignment length error
Explanation: Your program attempted to assign to a string variable a
character string that is longer than the declared maximum length of the
variable (if the variable’s type is VARYING) or that is not of the same
length as the variable (if the variable’s type is PACKED ARRAY OF
CHAR).
User Action: Correct the program so that the string is of a correct length
for the variable to which it is being assigned
Kod: Markera allt
$ pascal /nooptimize /list /machine_code str_pas
$
$ type STR_PAS.LIS
STR Source Code Listing 2-JAN-2014 12:13:45 HP Pascal Alpha V6.1-116 Page 1
01 2-JAN-2014 02:34:22 USER:<JANNE.STRING>STR_PAS.PAS;20
IDC-PL-SL
0 0 1 program str(output);
0 0 2 var
0 0 3 text : string(5);
0 0 4 begin
0 1 5 text := "ABCDEF";
0 1 6 writeln(text);
0 0 7 end.
STR Machine Code Listing 2-JAN-2014 12:13:45 HP Pascal Alpha V6.1-116 Page 2
01 2-JAN-2014 02:34:22 USER:<JANNE.STRING>STR_PAS.PAS;20
IDC-PL-SL
.PSECT $CODE$, OCTA, PIC, CON, REL, LCL, SHR,-
EXE, NORD, NOWRT
0000 STR:
23DEFFD0 0000 LDA SP, -48(SP)
B77E0000 0004 STQ R27, (SP)
B75E0018 0008 STQ R26, 24(SP)
B45E0020 000C STQ R2, 32(SP)
B7BE0028 0010 STQ FP, 40(SP)
63FF0000 0014 TRAPB
47FE041D 0018 MOV SP, FP
47FB0402 001C MOV R27, R2
47FE0400 0020 MOV SP, R0
47E0B401 0024 MOV 5, R1 ; 000003
B03D0010 0028 STL R1, TEXT%TYPE ; R1, 16(FP)
47E0F411 002C MOV 7, R17
B23D0014 0030 STL R17, 20(FP)
23DEFFF0 0034 LDA SP, -16(SP)
47FE0401 0038 MOV SP, R1
47FE0400 003C MOV SP, R0
B43D0008 0040 STQ R1, 8(FP)
47E0D413 0044 MOV 6, R19 ; 000005
4260B7B0 0048 CMPULE R19, 5, R16
2FFE0000 004C UNOP
E6000029 0050 BEQ R16, L$3
0054 L$2:
A61D0008 0054 LDQ R16, 8(FP)
47E0B401 0058 MOV 5, R1
42610532 005C SUBQ R19, R1, R18
46410CD3 0060 CMOVGT R18, R1, R19
F2000027 0064 BLBS R16, L$4
0068 L$5:
2C100000 0068 LDQ_U R0, (R16)
4A700372 006C INSWL R19, R16, R18
48100240 0070 MSKWL R0, R16, R0
44120400 0074 BIS R0, R18, R0
3C100000 0078 STQ_U R0, (R16)
22100002 007C LDA R16, 2(R16)
47F30411 0080 MOV R19, R17
22420040 0084 LDA R18, 64(R2)
A7420038 0088 LDQ R26, 56(R2)
2FFE0000 008C UNOP
6B5A4000 0090 JSR R26, OTS$MOVE ; R26, R26
A41D0008 0094 LDQ R0, 8(FP) ; 000006
A2200000 0098 LDL R17, (R0)
4A261731 009C SLL R17, 48, R17
4A261691 00A0 SRL R17, 48, R17
A43D0008 00A4 LDQ R1, 8(FP)
22410002 00A8 LDA R18, 2(R1)
A6020030 00AC LDQ R16, 48(R2)
47E07419 00B0 MOV 3, R25
A7420050 00B4 LDQ R26, 80(R2)
A7620058 00B8 LDQ R27, 88(R2)
2FFE0000 00BC UNOP
6B5A4000 00C0 JSR R26, PAS$WRITE_STRING ; R26, R26
A6020030 00C4 LDQ R16, 48(R2)
STR Machine Code Listing 2-JAN-2014 12:13:45 HP Pascal Alpha V6.1-116 Page 3
01 STR 2-JAN-2014 02:34:22 USER:<JANNE.STRING>STR_PAS.PAS;20
IDC-PL-SL
47E03419 00C8 MOV 1, R25
A7420060 00CC LDQ R26, 96(R2)
A7620068 00D0 LDQ R27, 104(R2)
6B5A4000 00D4 JSR R26, PAS$WRITELN2 ; R26, R26
47E03400 00D8 MOV 1, R0 ; 000007
63FF0000 00DC TRAPB
47FD041E 00E0 MOV FP, SP
A75D0018 00E4 LDQ R26, 24(FP)
A45D0020 00E8 LDQ R2, 32(FP)
A7BD0028 00EC LDQ FP, 40(FP)
23DE0030 00F0 LDA SP, 48(SP)
6BFA8001 00F4 RET R26
00F8 L$3: ; 000005
221FBFF6 00F8 MOV -16394, R16
000000AA 00FC GENTRAP
C3FFFFD4 0100 BR L$2
0104 L$4:
2C100001 0104 LDQ_U R0, 1(R16)
4A700AF2 0108 INSWH R19, R16, R18
48100A40 010C MSKWH R0, R16, R0
44120400 0110 BIS R0, R18, R0
3C100001 0114 STQ_U R0, 1(R16)
C3FFFFD3 0118 BR L$5
Routine Size: 284 bytes, Routine Base: $CODE$ + 0000
.PSECT $LINK$, OCTA, NOPIC, CON, REL, LCL,-
NOSHR, NOEXE, RD, NOWRT
0000 ; Stack-Frame invocation descriptor
Entry point: STR
Entry Length: 28
Static Handler: PAS$HANDLER2
Registers used: R0-R2, R16-R20, R25-R26, R28-FP
Registers saved: R2, FP
Fixed Stack Size: 48
00000000 ; Handler data for PAS$HANDLER2
00000000
00000000
00000000
00000000 0030 .ADDRESS PAS$FV_OUTPUT
0038 .CODE_ADDRESS OTS$MOVE
44434241 0040 .ASCII \ABCDEF\
4645 0044
0050 .LINKAGE PAS$WRITE_STRING
0060 .LINKAGE PAS$WRITELN2
Pascal Compilation Statistics 2-JAN-2014 12:13:45 HP Pascal Alpha V6.1-116 Page 4
2-JAN-2014 02:34:22 USER:<JANNE.STRING>STR_PAS.PAS;20
PSECT SUMMARY
Name Bytes Attributes
$CODE$ 284 pic, con, rel, lcl, shr, exe, nord, nowrt, align(4)
$LINK$ 112 nopic, con, rel, lcl, noshr, noexe, rd, nowrt, align(4)
COMMAND QUALIFIERS
PASCAL/NOOPTIMIZE/LIST/MACHINE_CODE STR_PAS
/ALIGN=NATURAL
/NOANALYSIS_DATA
/ARCHITECTURE=GENERIC
/ASSUME=(ACCURACY_SENSITIVE,NOBYTE_ALIGNED_POINTERS)
/CDD_QUAD_TYPE=EMPTY_RECORD
/CHECK=(BOUNDS,NOCASE_SELECTORS,DECLARATIONS,NOOVERFLOW,
NOPOINTERS,NOSUBRANGE)
/CONSTANT=NONE
/NOCROSS_REFERENCE
/DEBUG=(NOSYMBOLS,TRACEBACK)
/NODESIGN
/NODIAGNOSTICS
/ENUMERATION_SIZE=LONG
/NOENVIRONMENT
/ERROR_LIMIT=30
/FLOAT=G_FLOAT
/GRANULARITY=QUADWORD
/IDENT=01
/INCLUDE=None Specified
/LIST=USER:<JANNE.STRING>STR_PAS.LIS;17
/MACHINE
/MATH_LIBRARY=ACCURATE
/OBJECT=USER:<JANNE.STRING>STR_PAS.OBJ;25
/OPTIMIZE=(LEVEL=0,TUNE=GENERIC,INLINE=NONE)
/PEN_CHECKING_STYLE=COMPILATION_TIME
/NOPLATFORMS
/PSECT_MODEL=NOMULTILANGUAGE
/SHOW=(DICTIONARY,INCLUDE,HEADER,SOURCE,NOSTRUCTURE_LAYOUT,STATISTICS)
/NOSTANDARD
/TERMINAL=NONE
/NOTIE
/USAGE=(NOUNCERTAIN,UNINITIALIZED,NOUNUSED,VOLATILE,EMPTY_RECORDS,
PACKED_ACTUALS,UNSUPPORTED_CDD,NOPERFORMANCE,NONGRNACC,NOUNCALLABLE)
/WARNINGS
/ZERO_HEAP
Pascal Compilation Statistics 2-JAN-2014 12:13:45 HP Pascal Alpha V6.1-116 Page 5
2-JAN-2014 02:34:22 USER:<JANNE.STRING>STR_PAS.PAS;20
COMPILER INTERNAL TIMING
Phase CPU Elapsed Page I/O
seconds seconds faults count
Initialization 0.01 0.00 16 0
Source analysis 0.00 0.00 50 1
Symbol Table and IL Generation 0.00 0.00 28 0
Symbol Table Conversion 0.00 0.00 8 0
CIL Generation 0.00 0.00 18 0
CIL Fixup 0.00 0.00 0 0
Pointer type alias analysis 0.00 0.00 0 0
IL expansion 0.00 0.00 28 0
Optimization 0.00 0.00 0 0
Dominator tree construction 0.00 0.00 0 0
Loop dominator insertion 0.00 0.00 0 0
Lifetime analysis 0.00 0.00 0 0
IDEF computation 0.00 0.00 0 0
DATAFLOW computation 0.00 0.00 2 0
Loop transforms 0.00 0.00 0 0
BR loop/branch optimization 0.00 0.00 0 0
Strength reduction 0.00 0.00 0 0
Loop unroll/Loop optimization 0.00 0.00 0 0
Test replacement 0.00 0.00 0 0
Profitability determination 0.00 0.00 0 0
Profitability reordering 0.00 0.00 0 0
Use propagation 0.00 0.00 0 0
Split lifetime analysis 0.00 0.00 0 0
Base Binding 0.00 0.00 0 0
Code Generation 0.00 0.00 59 0
Context analysis 0.00 0.00 23 0
Register History 0.00 0.00 0 0
Temporary allocation 0.00 0.00 7 0
Code emission 0.00 0.00 20 0
Final 0.00 0.00 18 0
Peepholing 0.00 0.00 5 0
Final flow analysis 0.00 0.00 0 0
Object scheduling 0.00 0.00 0 0
Branch/jump resolution 0.00 0.00 7 0
Object module generation 0.00 0.00 19 0
DST generation 0.00 0.00 0 0
Listing 0.00 0.00 3 0
Compiler totals 0.03 0.12 368 25
COMPILATION STATISTICS
CPU time: 0.03 seconds
Elapsed time: 0.12 seconds
Pagefaults: 368
I/O Count: 25
Source lines: 7
14000 lines per CPU minute.
$
Kod: Markera allt
47E0D413 0044 MOV 6, R19 ; 000005
4260B7B0 0048 CMPULE R19, 5, R16
2FFE0000 004C UNOP
E6000029 0050 BEQ R16, L$3
...
...
00F8 L$3: ; 000005
221FBFF6 00F8 MOV -16394, R16
000000AA 00FC GENTRAP
C3FFFFD4 0100 BR L$28
Öh nä, det betyder bara att Pascalkompilatorn lägger in lite extrakod för att kolla att tilldelningen är giltig, har ju absolut ingenting med pseudokod öht. att göra.TomasL skrev:Det måste betyda att Pascal inte kompilerar till exekverbar kod, utan till pseudokod, vilken sedan körs av en runtime-modul, på samma sätt som BASIC, JAVA .NET mfl.
Skillnaden är ju att C kompilerar till exekverbar kod, alltså finns det ingen runtime-modul som kan övervaka detta.
Sedan har jag en känsla av att varningar för sådana här saker är beroende på vilka verktyg man använder.
Nja, håller inte med. De värsta buggarna är ju inte de som får programmet att krascha, de upptäcker man ju rätt fort, det är värre med de som orsakar logiska fel och felaktiga data utan att krascha eller lämna varningar/felmeddelanden, de kan lurka kvar i åratal...sodjan skrev: Det är alltså Pascal runtime miljön som säger ifrån, inte OS'et i sig.
Om man har ett OS som inte har bra minnesskydd, där man t.ex kan skriva
till areaor som har exekverbar kod, så förvärras det hela. D.v.s att man inte
skulle få t.ex en ACCVIO som ovan utan det skulle krascha på ett mer
okontrollerat sätt. Eller så uppstår det en "exploit". C's perkare är en
annan källa till problem, men som sagt, så länge man bara inte kan skriva
till minnesareaor som har exekverbar kod, så är det rellativt lungt.
Kod: Markera allt
{
char s[5];
char Status = 1;
strcpy(s, "abcde");
if(Status)
printf("%s", s);
return 0;
}