Skip to content

Commit e6e9b7e

Browse files
committed
fbc: sf.net # 996: fix null pointer access checking for defined(udt.cast)
fixed an internal null pointer access: type T field as long declare sub proc() end type #if defined( T.cast ) #endif Aborting due to runtime error 7 (null pointer access) at line 704 of src\compiler\parser-identifier.bas::CIDENTIFIERORUDTMEMBER()
1 parent 82f3342 commit e6e9b7e

File tree

8 files changed

+166
-16
lines changed

8 files changed

+166
-16
lines changed

changelog.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ Version 1.10.1
2525
- emscripten/fbc: -sASYNCIFY wasn't passed to emcc at link-time as needed by recent Emscripten
2626
- sf.net #993: ignore (parse) single line comments for macros invoked with optional parentheses instead of passing as an argument to macro
2727
- sf.net #994: Bad handling of macro argument evaluation - reset file pointers to previous context after evaluating arguments in __fb_query_symbol__, __fb_eval__, __fb_arg_extract__, __fb_iif__, and releasing lexer context
28+
- sf.net #996: fbc null pointer access testing defined(UDT.cast)
2829

2930

3031
Version 1.10.0

src/compiler/parser-identifier.bas

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -689,19 +689,33 @@ function cIdentifierOrUDTMember _
689689
end if
690690

691691
'' else there are member procs, so search for keywords as members
692+
'' !!!TODO!!! - optimize lookups
693+
'' symbGetCompXXX() functions test for things we already know here
692694

693695
select case as const lexGetToken( )
694696
case FB_TK_CONSTRUCTOR
695697
sym = symbGetCompCtorHead( base_parent )
698+
'' if( base_parent->udt.ext ) then
699+
'' sym = base_parent->udt.ext->ctorhead
700+
'' end if
696701

697702
case FB_TK_DESTRUCTOR
698703
sym = symbGetCompDtor1( base_parent )
704+
'' if( base_parent->udt.ext ) then
705+
'' sym = base_parent->udt.ext->dtor1
706+
'' end if
699707

700708
case FB_TK_LET
701709
sym = symbGetCompOpOvlHead( base_parent, AST_OP_ASSIGN )
710+
'' if( base_parent->udt.ext ) then
711+
'' sym = symbGetUDTOpOvlTb( base_parent )(AST_OP_ASSIGN - AST_OP_SELFBASE)
712+
'' end if
702713

703714
case FB_TK_CAST
704-
sym = symbGetUDTOpOvlTb( base_parent )(AST_OP_CAST - AST_OP_SELFBASE)
715+
sym = symbGetCompOpOvlHead( base_parent, AST_OP_CAST )
716+
'' if( base_parent->udt.ext ) then
717+
'' sym = symbGetUDTOpOvlTb( base_parent )(AST_OP_CAST - AST_OP_SELFBASE)
718+
'' end if
705719

706720
end select
707721

tests/syntax/defined-3.bas

Lines changed: 75 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,47 @@
1-
type T
1+
#print "T1 -- fields only"
2+
type T1
3+
value as integer
4+
end type
5+
6+
#if defined( T1.value )
7+
#print "T1.value defined"
8+
#else
9+
#print "T1.value not defined - NOK"
10+
#endif
11+
12+
#if defined( T1.constructor )
13+
#print "T1.constructor defined - NOK"
14+
#else
15+
#print "T1.constructor not defined"
16+
#endif
17+
18+
#if defined( T1.destructor )
19+
#print "T1.constructor defined - NOK"
20+
#else
21+
#print "T1.constructor not defined"
22+
#endif
23+
24+
#if defined( T1.let )
25+
#print "T1.let defined - NOK"
26+
#else
27+
#print "T1.let not defined"
28+
#endif
29+
30+
#if defined( T1.cast )
31+
#print "T1.cast defined - NOK"
32+
#else
33+
#print "T1.cast not defined"
34+
#endif
35+
36+
#print "T2 -- fields and procedures"
37+
type T2
238
value as integer
339
static svalue as integer
440
declare sub proc()
541
declare static sub sproc()
642
end type
743

8-
sub T.proc()
44+
sub T2.proc()
945

1046
#if defined( value )
1147
#print "value defined"
@@ -31,31 +67,55 @@ sub T.proc()
3167
#print "sproc not defined - NOK"
3268
#endif
3369

34-
#if ENABLE_CHECK_BUGS
70+
#if defined( T2.value )
71+
#print "T2.value defined"
72+
#else
73+
#print "T2.value not defined - NOK"
74+
#endif
3575

36-
#if defined( T.value )
37-
#print "T.value defined"
76+
#if defined( T2.proc )
77+
#print "T2.proc defined"
3878
#else
39-
#print "T.value not defined - NOK"
79+
#print "T2.proc not defined - NOK"
4080
#endif
4181

42-
#if defined( T.proc )
43-
#print "T.proc defined"
82+
#if defined( T2.svalue )
83+
#print "T2.svalue defined"
4484
#else
45-
#print "T.proc not defined - NOK"
85+
#print "T2.svalue not defined - NOK"
4686
#endif
4787

48-
#if defined( T.svalue )
49-
#print "T.svalue defined"
88+
#if defined( T2.sproc )
89+
#print "T2.sproc defined"
5090
#else
51-
#print "T.svalue not defined - NOK"
91+
#print "T2.sproc not defined - NOK"
5292
#endif
5393

54-
#if defined( T.sproc )
55-
#print "T.sproc defined"
94+
#if defined( T2.constructor )
95+
#print "T2.constructor defined - NOK"
96+
#else
97+
#print "T2.constructor not defined"
98+
#endif
99+
100+
#if defined( T2.destructor )
101+
#print "T2.constructor defined - NOK"
56102
#else
57-
#print "T.sproc not defined - NOK"
103+
#print "T2.constructor not defined"
58104
#endif
105+
106+
#if defined( T2.let )
107+
#print "T2.let defined - NOK"
108+
#else
109+
#print "T2.let not defined"
110+
#endif
111+
112+
#if defined( T2.cast )
113+
#print "T2.cast defined - NOK"
114+
#else
115+
#print "T2.cast not defined"
116+
#endif
117+
118+
#if ENABLE_CHECK_BUGS
59119

60120
#if defined( this.svalue )
61121
#print "this.svalue defined"

tests/syntax/r/dos/defined-3.txt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,19 @@
1+
T1 -- fields only
2+
T1.value defined
3+
T1.constructor not defined
4+
T1.constructor not defined
5+
T1.let not defined
6+
T1.cast not defined
7+
T2 -- fields and procedures
18
value defined
29
proc defined
310
svalue defined
411
sproc defined
12+
T2.value defined
13+
T2.proc defined
14+
T2.svalue defined
15+
T2.sproc defined
16+
T2.constructor not defined
17+
T2.constructor not defined
18+
T2.let not defined
19+
T2.cast not defined
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,19 @@
1+
T1 -- fields only
2+
T1.value defined
3+
T1.constructor not defined
4+
T1.constructor not defined
5+
T1.let not defined
6+
T1.cast not defined
7+
T2 -- fields and procedures
18
value defined
29
proc defined
310
svalue defined
411
sproc defined
12+
T2.value defined
13+
T2.proc defined
14+
T2.svalue defined
15+
T2.sproc defined
16+
T2.constructor not defined
17+
T2.constructor not defined
18+
T2.let not defined
19+
T2.cast not defined
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,19 @@
1+
T1 -- fields only
2+
T1.value defined
3+
T1.constructor not defined
4+
T1.constructor not defined
5+
T1.let not defined
6+
T1.cast not defined
7+
T2 -- fields and procedures
18
value defined
29
proc defined
310
svalue defined
411
sproc defined
12+
T2.value defined
13+
T2.proc defined
14+
T2.svalue defined
15+
T2.sproc defined
16+
T2.constructor not defined
17+
T2.constructor not defined
18+
T2.let not defined
19+
T2.cast not defined

tests/syntax/r/win32/defined-3.txt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,19 @@
1+
T1 -- fields only
2+
T1.value defined
3+
T1.constructor not defined
4+
T1.constructor not defined
5+
T1.let not defined
6+
T1.cast not defined
7+
T2 -- fields and procedures
18
value defined
29
proc defined
310
svalue defined
411
sproc defined
12+
T2.value defined
13+
T2.proc defined
14+
T2.svalue defined
15+
T2.sproc defined
16+
T2.constructor not defined
17+
T2.constructor not defined
18+
T2.let not defined
19+
T2.cast not defined

tests/syntax/r/win64/defined-3.txt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,19 @@
1+
T1 -- fields only
2+
T1.value defined
3+
T1.constructor not defined
4+
T1.constructor not defined
5+
T1.let not defined
6+
T1.cast not defined
7+
T2 -- fields and procedures
18
value defined
29
proc defined
310
svalue defined
411
sproc defined
12+
T2.value defined
13+
T2.proc defined
14+
T2.svalue defined
15+
T2.sproc defined
16+
T2.constructor not defined
17+
T2.constructor not defined
18+
T2.let not defined
19+
T2.cast not defined

0 commit comments

Comments
 (0)