diff options
author | Behdad Esfahbod <behdad@behdad.org> | 2010-04-23 16:35:01 -0400 |
---|---|---|
committer | Behdad Esfahbod <behdad@behdad.org> | 2010-04-23 17:44:28 -0400 |
commit | 187454c595559ce48d072fee6bccb51f3de283d4 (patch) | |
tree | 815b6bf098526c07d47ab1b8f2e21134d487099f /src | |
parent | efb324a46ff64adb4ec8612b4089e8daff1e6d8e (diff) |
Add different casts from pointer and ref to avoid bugs
Diffstat (limited to 'src')
-rw-r--r-- | src/hb-open-type-private.hh | 22 | ||||
-rw-r--r-- | src/hb-ot-layout-gpos-private.hh | 8 | ||||
-rw-r--r-- | src/hb-ot-layout-gsub-private.hh | 12 | ||||
-rw-r--r-- | src/main.cc | 6 |
4 files changed, 28 insertions, 20 deletions
diff --git a/src/hb-open-type-private.hh b/src/hb-open-type-private.hh index 232a61e..daf0c40 100644 --- a/src/hb-open-type-private.hh +++ b/src/hb-open-type-private.hh @@ -49,14 +49,22 @@ template <typename Type> inline char * CharP (Type* X) { return reinterpret_cast<char *>(X); } -/* Cast to struct T& */ +/* Cast to struct T, reference to reference */ template<typename Type, typename TObject> -inline const Type& Cast(const TObject &X) +inline const Type& CastR(const TObject &X) { return reinterpret_cast<const Type&> (X); } template<typename Type, typename TObject> -inline Type& Cast(TObject &X) +inline Type& CastR(TObject &X) { return reinterpret_cast<Type&> (X); } +/* Cast to struct T, pointer to pointer */ +template<typename Type, typename TObject> +inline const Type* CastP(const TObject *X) +{ return reinterpret_cast<const Type*> (X); } +template<typename Type, typename TObject> +inline Type* CastP(TObject *X) +{ return reinterpret_cast<Type*> (X); } + /* StructAtOffset<T>(X,Ofs) returns the struct T& that is placed at memory * location of X plus Ofs bytes. */ template<typename Type, typename TObject> @@ -91,7 +99,7 @@ static const void *_NullPool[32 / sizeof (void *)]; template <typename Type> static inline const Type& Null () { ASSERT_STATIC (sizeof (Type) <= sizeof (_NullPool)); - return Cast<Type> (*_NullPool); + return *CastP<Type> (_NullPool); } /* Specializaiton for arbitrary-content arbitrary-sized Null objects. */ @@ -99,7 +107,7 @@ static inline const Type& Null () { static const char _Null##Type[size + 1] = data; /* +1 is for nul-termination in data */ \ template <> \ inline const Type& Null<Type> () { \ - return Cast<Type> (*_Null##Type); \ + return *CastP<Type> (_Null##Type); \ } /* The following line really exists such that we end in a place needing semicolon */ \ ASSERT_STATIC (sizeof (Type) + 1 <= sizeof (_Null##Type)) @@ -281,7 +289,7 @@ struct Sanitizer _hb_sanitize_init (&context, blob); /* Note: We drop const here */ - Type *t = &Cast<Type> (* (char *) CharP(context.start)); + Type *t = CastP<Type> ((void *) context.start); sane = t->sanitize (SANITIZE_ARG_INIT); if (sane) { @@ -326,7 +334,7 @@ struct Sanitizer } static const Type& lock_instance (hb_blob_t *blob) { - return Cast<Type> (* (const char *) hb_blob_lock (blob)); + return *CastP<Type> (hb_blob_lock (blob)); } }; diff --git a/src/hb-ot-layout-gpos-private.hh b/src/hb-ot-layout-gpos-private.hh index 73ac56d..777874b 100644 --- a/src/hb-ot-layout-gpos-private.hh +++ b/src/hb-ot-layout-gpos-private.hh @@ -1445,7 +1445,7 @@ struct PosLookupSubTable struct PosLookup : Lookup { inline const PosLookupSubTable& get_subtable (unsigned int i) const - { return this+Cast<OffsetArrayOf<PosLookupSubTable> > (subTable)[i]; } + { return this+CastR<OffsetArrayOf<PosLookupSubTable> > (subTable)[i]; } inline bool apply_once (hb_ot_layout_context_t *context, hb_buffer_t *buffer, @@ -1504,7 +1504,7 @@ struct PosLookup : Lookup inline bool sanitize (SANITIZE_ARG_DEF) { TRACE_SANITIZE (); if (HB_UNLIKELY (!Lookup::sanitize (SANITIZE_ARG))) return false; - OffsetArrayOf<PosLookupSubTable> &list = Cast<OffsetArrayOf<PosLookupSubTable> > (subTable); + OffsetArrayOf<PosLookupSubTable> &list = CastR<OffsetArrayOf<PosLookupSubTable> > (subTable); return SANITIZE_THIS (list); } }; @@ -1521,7 +1521,7 @@ struct GPOS : GSUBGPOS static const hb_tag_t Tag = HB_OT_TAG_GPOS; inline const PosLookup& get_lookup (unsigned int i) const - { return Cast<PosLookup> (GSUBGPOS::get_lookup (i)); } + { return CastR<PosLookup> (GSUBGPOS::get_lookup (i)); } inline bool position_lookup (hb_ot_layout_context_t *context, hb_buffer_t *buffer, @@ -1532,7 +1532,7 @@ struct GPOS : GSUBGPOS inline bool sanitize (SANITIZE_ARG_DEF) { TRACE_SANITIZE (); if (HB_UNLIKELY (!GSUBGPOS::sanitize (SANITIZE_ARG))) return false; - OffsetTo<PosLookupList> &list = Cast<OffsetTo<PosLookupList> > (lookupList); + OffsetTo<PosLookupList> &list = CastR<OffsetTo<PosLookupList> > (lookupList); return SANITIZE_THIS (list); } }; diff --git a/src/hb-ot-layout-gsub-private.hh b/src/hb-ot-layout-gsub-private.hh index fc3bb29..77c27a8 100644 --- a/src/hb-ot-layout-gsub-private.hh +++ b/src/hb-ot-layout-gsub-private.hh @@ -743,7 +743,7 @@ struct SubstLookupSubTable struct SubstLookup : Lookup { inline const SubstLookupSubTable& get_subtable (unsigned int i) const - { return this+Cast<OffsetArrayOf<SubstLookupSubTable> > (subTable)[i]; } + { return this+CastR<OffsetArrayOf<SubstLookupSubTable> > (subTable)[i]; } inline static bool lookup_type_is_reverse (unsigned int lookup_type) { return lookup_type == SubstLookupSubTable::ReverseChainSingle; } @@ -752,7 +752,7 @@ struct SubstLookup : Lookup { unsigned int type = get_type (); if (HB_UNLIKELY (type == SubstLookupSubTable::Extension)) - return Cast<ExtensionSubst> (get_subtable(0)).is_reverse (); + return CastR<ExtensionSubst> (get_subtable(0)).is_reverse (); return lookup_type_is_reverse (type); } @@ -839,7 +839,7 @@ struct SubstLookup : Lookup inline bool sanitize (SANITIZE_ARG_DEF) { TRACE_SANITIZE (); if (HB_UNLIKELY (!Lookup::sanitize (SANITIZE_ARG))) return false; - OffsetArrayOf<SubstLookupSubTable> &list = Cast<OffsetArrayOf<SubstLookupSubTable> > (subTable); + OffsetArrayOf<SubstLookupSubTable> &list = CastR<OffsetArrayOf<SubstLookupSubTable> > (subTable); return SANITIZE_THIS (list); } }; @@ -856,7 +856,7 @@ struct GSUB : GSUBGPOS static const hb_tag_t Tag = HB_OT_TAG_GSUB; inline const SubstLookup& get_lookup (unsigned int i) const - { return Cast<SubstLookup> (GSUBGPOS::get_lookup (i)); } + { return CastR<SubstLookup> (GSUBGPOS::get_lookup (i)); } inline bool substitute_lookup (hb_ot_layout_context_t *context, hb_buffer_t *buffer, @@ -868,7 +868,7 @@ struct GSUB : GSUBGPOS inline bool sanitize (SANITIZE_ARG_DEF) { TRACE_SANITIZE (); if (HB_UNLIKELY (!GSUBGPOS::sanitize (SANITIZE_ARG))) return false; - OffsetTo<SubstLookupList> &list = Cast<OffsetTo<SubstLookupList> > (lookupList); + OffsetTo<SubstLookupList> &list = CastR<OffsetTo<SubstLookupList> > (lookupList); return SANITIZE_THIS (list); } }; @@ -896,7 +896,7 @@ inline bool ExtensionSubst::is_reverse (void) const { unsigned int type = get_type (); if (HB_UNLIKELY (type == SubstLookupSubTable::Extension)) - return Cast<ExtensionSubst> (get_subtable()).is_reverse (); + return CastR<ExtensionSubst> (get_subtable()).is_reverse (); return SubstLookup::lookup_type_is_reverse (type); } diff --git a/src/main.cc b/src/main.cc index badf91b..2e0927a 100644 --- a/src/main.cc +++ b/src/main.cc @@ -61,7 +61,7 @@ main (int argc, char **argv) printf ("Opened font file %s: %d bytes long\n", argv[1], len); - const OpenTypeFontFile &ot = Cast<OpenTypeFontFile> (font_data); + const OpenTypeFontFile &ot = *CastP<OpenTypeFontFile> (font_data); switch (ot.get_tag ()) { case OpenTypeFontFile::TrueTypeTag: @@ -99,7 +99,7 @@ main (int argc, char **argv) case GSUBGPOS::GPOSTag: { - const GSUBGPOS &g = Cast<GSUBGPOS> (font_data + table.offset); + const GSUBGPOS &g = *CastP<GSUBGPOS> (font_data + table.offset); int num_scripts = g.get_script_count (); printf (" %d script(s) found in table\n", num_scripts); @@ -162,7 +162,7 @@ main (int argc, char **argv) case GDEF::Tag: { - const GDEF &gdef = Cast<GDEF> (font_data + table.offset); + const GDEF &gdef = *CastP<GDEF> (font_data + table.offset); printf (" Has %sglyph classes\n", gdef.has_glyph_classes () ? "" : "no "); |