Skip to content

Commit 350bcaf

Browse files
committed
BCTYPES: fail when accessing properties of unresolved typedefs
1 parent cb91ab2 commit 350bcaf

File tree

3 files changed

+113
-26
lines changed

3 files changed

+113
-26
lines changed

chb/bctypes/BCConverter.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
# ------------------------------------------------------------------------------
55
# The MIT License (MIT)
66
#
7-
# Copyright (c) 2022-2023 Aarno Labs LLC
7+
# Copyright (c) 2022-2024 Aarno Labs LLC
88
#
99
# Permission is hereby granted, free of charge, to any person obtaining a copy
1010
# of this software and associated documentation files (the "Software"), to deal

chb/bctypes/BCDictionary.py

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@
2626
# ------------------------------------------------------------------------------
2727
"""Dictionary of CIL-types as produced by the CIL parser."""
2828

29-
from typing import Any, Callable, Dict, List, Optional, Tuple, TYPE_CHECKING
29+
from typing import (
30+
Any, Callable, cast, Dict, List, Optional, Tuple, TYPE_CHECKING)
3031

3132
import xml.etree.ElementTree as ET
3233

@@ -43,7 +44,7 @@
4344
from chb.bctypes.BCLHost import BCLHost
4445
from chb.bctypes.BCLval import BCLval
4546
from chb.bctypes.BCOffset import BCOffset
46-
from chb.bctypes.BCTyp import BCTyp
47+
from chb.bctypes.BCTyp import BCTyp, BCTypNamed
4748
from chb.bctypes.BCTypSig import BCTypSig, BCTypSigList
4849
from chb.bctypes.BCTypeInfo import BCTypeInfo
4950
from chb.bctypes.BCVarInfo import BCVarInfo
@@ -119,6 +120,9 @@ def app(self) -> "AppAccess":
119120

120121
# ------------------------- retrieve items by name/key ---------------------
121122

123+
def has_typeinfo_by_name(self, name: str) -> bool:
124+
return name in self.typeinfo_names
125+
122126
def typeinfo_by_name(self, name: str) -> BCTypeInfo:
123127
if name in self.typeinfo_names:
124128
return self.typeinfo_names[name]
@@ -265,7 +269,24 @@ def typ_table_to_string(self) -> str:
265269
lines: List[str] = []
266270

267271
def f(ix: int, v: IT.IndexedTableValue) -> None:
268-
lines.append(str(ix) + ": " + str(self.typ(ix)))
272+
ty = self.typ(ix)
273+
if ty.is_typedef:
274+
ty = cast(BCTypNamed, ty)
275+
resolves = ""
276+
if ty.typedef is not None:
277+
resolves = " (resolves to " + str(ty.typedef.ttype) + ")"
278+
lines.append(str(ix) + ": " + ty.tname + resolves)
279+
else:
280+
lines.append(str(ix) + ": " + str(self.typ(ix)))
269281

270282
self.typ_table.iter(f)
271283
return "\n".join(lines)
284+
285+
def compinfo_table_to_string(self) -> str:
286+
lines: List[str] = []
287+
288+
def f(ix: int, v: IT.IndexedTableValue) -> None:
289+
lines.append(str(ix) + ": " + str(self.compinfo(ix)))
290+
291+
self.compinfo_table.iter(f)
292+
return "\n".join(lines)

chb/bctypes/BCTyp.py

Lines changed: 88 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -552,87 +552,153 @@ def tname(self) -> str:
552552
return self.tags[1]
553553

554554
@property
555-
def typedef(self) -> "BCTypeInfo":
556-
return self.bcd.typeinfo_by_name(self.tname)
555+
def typedef(self) -> Optional["BCTypeInfo"]:
556+
if self.bcd.has_typeinfo_by_name(self.tname):
557+
return self.bcd.typeinfo_by_name(self.tname)
558+
else:
559+
return None
557560

558561
@property
559562
def is_typedef(self) -> bool:
560563
return True
561564

562565
@property
563566
def is_scalar(self) -> bool:
564-
return self.typedef.ttype.is_scalar
567+
if self.typedef is not None:
568+
return self.typedef.ttype.is_scalar
569+
else:
570+
return False
565571

566572
@property
567573
def is_integer(self) -> bool:
568-
return self.typedef.ttype.is_integer
574+
if self.typedef is not None:
575+
return self.typedef.ttype.is_integer
576+
else:
577+
return False
569578

570579
@property
571580
def is_float(self) -> bool:
572-
return self.typedef.ttype.is_float
581+
if self.typedef is not None:
582+
return self.typedef.ttype.is_float
583+
else:
584+
return False
573585

574586
@property
575587
def is_pointer(self) -> bool:
576-
return self.typedef.ttype.is_pointer
588+
if self.typedef is not None:
589+
return self.typedef.ttype.is_pointer
590+
else:
591+
return False
577592

578593
@property
579594
def is_array(self) -> bool:
580-
return self.typedef.ttype.is_array
595+
if self.typedef is not None:
596+
return self.typedef.ttype.is_array
597+
else:
598+
return False
599+
600+
@property
601+
def is_struct(self) -> bool:
602+
if self.typedef is not None:
603+
return self.typedef.ttype.is_struct
604+
else:
605+
return False
581606

582607
def has_constant_size(self) -> bool:
583-
return self.typedef.ttype.has_constant_size()
608+
if self.typedef is not None:
609+
return self.typedef.ttype.has_constant_size()
610+
else:
611+
return False
584612

585613
@property
586614
def is_function(self) -> bool:
587-
return self.typedef.ttype.is_function
615+
if self.typedef is not None:
616+
return self.typedef.ttype.is_function
617+
else:
618+
return False
588619

589620
@property
590621
def is_vararg(self) -> bool:
591-
return self.typedef.ttype.is_vararg
622+
if self.typedef is not None:
623+
return self.typedef.ttype.is_vararg
624+
else:
625+
return False
592626

593627
@property
594628
def ikind(self) -> str:
595-
return self.typedef.ttype.ikind
629+
if self.typedef is not None:
630+
return self.typedef.ttype.ikind
631+
else:
632+
raise UF.CHBError("No type definition for " + self.tname)
596633

597634
@property
598635
def fkind(self) -> str:
599-
return self.typedef.ttype.fkind
636+
if self.typedef is not None:
637+
return self.typedef.ttype.fkind
638+
else:
639+
raise UF.CHBError("No type definition for " + self.tname)
600640

601641
@property
602642
def tgttyp(self) -> "BCTyp":
603-
return self.typedef.ttype.tgttyp
643+
if self.typedef is not None:
644+
return self.typedef.ttype.tgttyp
645+
else:
646+
raise UF.CHBError("No type definition for " + self.tname)
604647

605648
@property
606649
def size_expr(self) -> Optional["BCExp"]:
607-
return self.typedef.ttype.size_expr
650+
if self.typedef is not None:
651+
return self.typedef.ttype.size_expr
652+
else:
653+
return None
608654

609655
@property
610656
def sizevalue(self) -> int:
611-
return self.typedef.ttype.sizevalue
657+
if self.typedef is not None:
658+
return self.typedef.ttype.sizevalue
659+
else:
660+
raise UF.CHBError("No type definition for " + self.tname)
612661

613662
@property
614663
def returntype(self) -> "BCTyp":
615-
return self.typedef.ttype.returntype
664+
if self.typedef is not None:
665+
return self.typedef.ttype.returntype
666+
else:
667+
raise UF.CHBError("No type definition for " + self.tname)
616668

617669
@property
618670
def argtypes(self) -> Optional["BCFunArgs"]:
619-
return self.typedef.ttype.argtypes
671+
if self.typedef is not None:
672+
return self.typedef.ttype.argtypes
673+
else:
674+
return None
620675

621676
def is_leq(self, other: "BCTyp") -> bool:
622-
return self.typedef.ttype.is_leq(other)
677+
if self.typedef is not None:
678+
return self.typedef.ttype.is_leq(other)
679+
else:
680+
raise UF.CHBError("No type definition for " + self.tname)
623681

624682
def byte_size(self) -> int:
625-
return self.typedef.ttype.byte_size()
683+
if self.typedef is not None:
684+
return self.typedef.ttype.byte_size()
685+
else:
686+
raise UF.CHBError("No type definition for " + self.tname)
626687

627688
def alignment(self) -> int:
628-
return self.typedef.ttype.alignment()
689+
if self.typedef is not None:
690+
return self.typedef.ttype.alignment()
691+
else:
692+
raise UF.CHBError("No type definition for " + self.tname)
629693

630694
def convert(self, converter: "BCConverter") -> AST.ASTTyp:
631695
return converter.convert_named_typ(self)
632696

633697
def __str__(self) -> str:
634-
return str(self.typedef.ttype)
635-
# return self.tname + " (" + str(self.typedef.ttype) + ")"
698+
if self.typedef is not None:
699+
return str(self.typedef.ttype)
700+
else:
701+
return self.tname + " (no typedefinition available)"
636702

637703

638704
@bcregistry.register_tag("tcomp", BCTyp)

0 commit comments

Comments
 (0)