[FFmpeg-devel] [PATCH] matroskadec: Add sizes to forward declarations

Andreas Rheinhardt andreas.rheinhardt at gmail.com
Wed Jul 17 06:29:40 EEST 2019


Unknown-length elements end when an element not allowed in them, but
allowed at a higher level is encountered. In order to check for this,
c1abd95a added a pointer to every syntax level's parent to each
EbmlSyntax. Given that the parent must of course also reference the
child in order to be able to enter said child level, one needs to use
forward declarations.
These forward declarations constitute tentative definitions and tentative
definitions with internal linkage (like our syntaxes) must not be an
incomplete type. Yet they were an incomplete type and while GCC and
Clang did not even warn about this (on default warning levels), it
broke compilation with MSVC. Therefore this commit adds the sizes.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at gmail.com>
---
1. I am terribly sorry for this. I did test with both GCC and Clang, but
not with -pedantic, but only with default warning levels.
2. I don't have an MSVC setup here, so could please someone confirm that
this patch indeed fixes the compilation? All I know is that GCC's
-pedantic warnings are gone with this patch and that the requirement
that tentative definitions with internal linkage must not be of
incomplete type is fulfilled now.
 
 libavformat/matroskadec.c | 16 ++++++++++------
 1 file changed, 10 insertions(+), 6 deletions(-)

diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index b97189e674..fb0356e7b7 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -389,12 +389,16 @@ typedef struct MatroskaDemuxContext {
 
 #define CHILD_OF(parent) { .def = { .n = parent } }
 
-static const EbmlSyntax ebml_syntax[], matroska_segment[], matroska_track_video_color[], matroska_track_video[],
-                        matroska_track[], matroska_track_encoding[], matroska_track_encodings[],
-                        matroska_track_combine_planes[], matroska_track_operation[], matroska_tracks[],
-                        matroska_attachments[], matroska_chapter_entry[], matroska_chapter[], matroska_chapters[],
-                        matroska_index_entry[], matroska_index[], matroska_tag[], matroska_tags[], matroska_seekhead[],
-                        matroska_blockadditions[], matroska_blockgroup[], matroska_cluster_parsing[];
+// The following forward declarations need their size because
+// a tentative definition with internal linkage must not be an
+// incomplete type (6.7.2 in C90, 6.9.2 in C99).
+// Removing the sizes breaks MSVC.
+static const EbmlSyntax ebml_syntax[3], matroska_segment[9], matroska_track_video_color[15], matroska_track_video[19],
+                        matroska_track[27], matroska_track_encoding[6], matroska_track_encodings[2],
+                        matroska_track_combine_planes[2], matroska_track_operation[2], matroska_tracks[2],
+                        matroska_attachments[2], matroska_chapter_entry[9], matroska_chapter[6], matroska_chapters[2],
+                        matroska_index_entry[3], matroska_index[2], matroska_tag[3], matroska_tags[2], matroska_seekhead[2],
+                        matroska_blockadditions[2], matroska_blockgroup[8], matroska_cluster_parsing[8];
 
 static const EbmlSyntax ebml_header[] = {
     { EBML_ID_EBMLREADVERSION,    EBML_UINT, 0, offsetof(Ebml, version),         { .u = EBML_VERSION } },
-- 
2.21.0



More information about the ffmpeg-devel mailing list