Allow a lot more C99 features
authorPeter Wu <peter@lekensteyn.nl>
Wed, 31 Aug 2016 13:58:20 +0000 (15:58 +0200)
committerGuy Harris <guy@alum.mit.edu>
Tue, 6 Sep 2016 02:42:27 +0000 (02:42 +0000)
Flexible array members are supported by gcc, clang and even MSVC2013.
Note, so far it was only used in the Windows-specific airpcap.h.

Trailing commas in enum declaration are already in use since for
these dissectors (commit ID is the first occurrence):
epan/dissectors/packet-gluster.h v2.1.0rc0-1070-g3b706ba
epan/dissectors/packet-ipv6.c v2.1.2rc0-81-ge07b4aa
epan/dissectors/packet-netlink.h v2.3.0rc0-389-gc0ab12b
epan/dissectors/packet-netlink-netfilter.c v2.3.0rc0-239-g1767e08
epan/dissectors/packet-netlink-route.c v2.3.0rc0-233-g2a80b40
epan/dissectors/packet-quic.c v2.3.0rc0-457-gfa320f8

Inline functions using the "inline" keyword are supported via all glib
versions we support (if it is missing, glib will define a suitable
inline macro).

Other c99 functions listed in the README.developer document were found
to be compatible with GCC 4.4.7, Clang 3.4.2 and MSVC 2013.

Change-Id: If5bab03bfd8577b15a24bedf08c03bdfbf34317a
Reviewed-on: https://code.wireshark.org/review/17421
Reviewed-by: Guy Harris <guy@alum.mit.edu>
CMakeLists.txt
caputils/airpcap.h
configure.ac
doc/README.developer
tools/checkAPIs.pl

index ec6dc1370b7edf4ba80f11299e8f189b85276ae3..5b09c508a1113affdb3ee636cdc799e088271fbf 100644 (file)
@@ -308,7 +308,9 @@ if( CMAKE_C_COMPILER_ID MATCHES "MSVC")
        #  when compiling Wireshark sources. (Selected from "level 4" warnings).
        ## 4295: array is too small to include a terminating null character
        ## 4189: local variable is initialized but not referenced
-       set(WARNINGS_CFLAGS "/w34295 /w34189")
+       # Disable warnings about about use of flexible array members:
+       ## 4200: nonstandard extension used : zero-sized array in struct/union
+       set(WARNINGS_CFLAGS "/w34295 /w34189 /wd4200")
 
        set(WIRESHARK_COMMON_FLAGS
                ${LOCAL_CFLAGS}
@@ -343,6 +345,17 @@ else()
                endif()
        endif()
 
+       if(CMAKE_VERSION VERSION_LESS "3.1")
+               # Many modern compilers use c99 by default, but for older ones
+               # (like GCC 4.4.7), -std=gnu99 is required to avoid errors about
+               # use constructs like "for (int i = 0; i < n; i++) ;"
+               if(CMAKE_C_COMPILER_ID MATCHES "GNU")
+                       set(CMAKE_C_FLAGS "-std=gnu99 ${CMAKE_C_FLAGS}")
+               endif()
+       else()
+               set(CMAKE_C_STANDARD 99)
+       endif()
+
        if(CMAKE_C_COMPILER_ID MATCHES "Clang")
                set(WIRESHARK_COMMON_FLAGS ${WIRESHARK_COMMON_FLAGS}
                        # avoid "argument unused during compilation" warnings
@@ -391,8 +404,6 @@ else()
                # The Qt headers generate a ton of shortening errors on 64-bit systems
                # so only enable this for C for now.
                -Wshorten-64-to-32
-               # Clang only
-               -Wc99-extensions
        )
 
        set(CXX_WARN_FLAGS
index 538d8256672f44542c7d54f16539a6b2835546a7..dcef9388eac850beac1267795ca6cbab559be052 100644 (file)
@@ -23,8 +23,6 @@
 #define AIRPCAP_H__EAE405F5_0171_9592_B3C2_C19EC426AD34__INCLUDED_
 
 #ifdef _MSC_VER
-/* This disables a VS warning for zero-sized arrays. */
-#pragma warning( disable : 4200)
 /* This stops VS2005 ranting against stdio. */
 #pragma warning( disable : 4996)
 #endif
index fa8a4c220b3cc072f4e1b75aed8a01bcfe910242..452798851181f5078ff5b9b4d62fd2e08020bed9 100644 (file)
@@ -69,10 +69,12 @@ AC_CONFIG_LIBOBJ_DIR([wsutil])
 #
 # Checks for programs used in the main build process.
 #
-AC_PROG_CC_STDC
-if test "$ac_cv_prog_cc_stdc" = "no"
+# See doc/README.developer for allowed C99 features
+#
+AC_PROG_CC_C99
+if test "$ac_cv_prog_cc_c99" = "no"
 then
-       AC_MSG_ERROR([The C compiler does not support standard C])
+       AC_MSG_ERROR([The C compiler does not support C99])
 fi
 AC_PROG_CPP
 
@@ -690,9 +692,6 @@ then
        fi
 fi
 
-#Clang only
-AC_WIRESHARK_COMPILER_FLAGS_CHECK(-Wc99-extensions, C)
-
 #
 # Try to add some additional checks to CFLAGS.
 # These are not enabled by default, because the warnings they produce
index d7e5a09af1fa5b698ae4537e36db3af62b71ae26..76adcb7f0f151ac7a26bece900a666d5f482ae8c 100644 (file)
@@ -67,18 +67,20 @@ Wireshark runs on many platforms, and can be compiled with a number of
 different compilers; here are some rules for writing code that will work
 on multiple platforms.
 
-Don't use C++-style comments (comments beginning with "//" and running
-to the end of the line) in C code. Wireshark's dissectors are written in
-C, and thus run through C rather than C++ compilers, and not all C
-compilers support C++-style comments (GCC does, but IBM's C compiler for
-AIX, for example, doesn't do so by default). C++-style comments can be
-used in C++ code, of course.
-
-In general, don't use C99 features since some C compilers used to compile
-Wireshark, such as Microsoft's C compiler, don't support all C99
+In general, not all C99 features can be used since some C compilers used to
+compile Wireshark, such as Microsoft's C compiler, don't support all C99
 features.  The C99 features that can be used are:
 
-       variadic macros
+ - flexible array members
+ - compound literals
+ - designated initializers
+ - "//" comments
+ - mixed declarations and code
+ - new block scopes for selection and iteration statements (that is, declaring
+   the type in a for-loop like: for (int i = 0; i < n; i++) ;)
+ - macros with a variable number of arguments (variadic macros)
+ - trailing comma in enum declarations
+ - inline functions (guaranteed only by use of glib.h)
 
 Don't initialize variables in their declaration with non-constant
 values. Not all compilers support this. E.g. don't use
@@ -88,12 +90,8 @@ use
     i = somearray[2];
 instead.
 
-Don't use zero-length arrays; not all compilers support them.  If an
-array would have no members, just leave it out.
-
-Don't declare variables in the middle of executable code; not all C
-compilers support that.  Variables should be declared outside a
-function, or at the beginning of a function or compound statement.
+Don't use zero-length arrays as structure members, use flexible array members
+instead.
 
 Don't use anonymous unions; not all compilers support them.
 Example:
@@ -296,9 +294,6 @@ not *little-endian* byte order; not all machines on which Wireshark runs
 are little-endian, even though PCs are.  Fetch those values using
 "tvb_get_letohs()" and "tvb_get_letohl()".
 
-Don't put a comma after the last element of an enum - some compilers may
-either warn about it (producing extra noise) or refuse to accept it.
-
 Do not use "open()", "rename()", "mkdir()", "stat()", "unlink()", "remove()",
 "fopen()", "freopen()" directly.  Instead use "ws_open()", "ws_rename()",
 "ws_mkdir()", "ws_stat()", "ws_unlink()", "ws_remove()", "ws_fopen()",
@@ -360,8 +355,6 @@ as some compilers will reject the first of those statements.  Instead,
 initialize the array at the point at which it's first declared, so that
 the size is known.
 
-Don't put a comma after the last tuple of an initializer of an array.
-
 For #define names and enum member names, prefix the names with a tag so
 as to avoid collisions with other names - this might be more of an issue
 on Windows, as it appears to #define names such as DELETE and
index cd6864c1fe32c3b76e4ca182a7f5744e65003aed..6117bf2575092df36dbfb2025caf5413d22fe2cd 100755 (executable)
@@ -2042,7 +2042,6 @@ while ($_ = pop @filelist)
         my $fileContents = '';
         my @foundAPIs = ();
         my $line;
-        my $prohibit_cpp_comments = 1;
 
         if ($source_dir and ! -e $filename) {
                 $filename = $source_dir . '/' . $filename;
@@ -2059,10 +2058,6 @@ while ($_ = pop @filelist)
                 next;
         }
 
-        # Establish or remove local taboos
-        if ($filename =~ m{ ui/qt/ }x) { $prohibit_cpp_comments = 0; }
-        if ($filename =~ m{ image/*.rc }x) { $prohibit_cpp_comments = 0; }
-
         # Read in the file (ouch, but it's easier that way)
         open(FC, $filename) || die("Couldn't open $filename");
         $line = 1;
@@ -2139,12 +2134,6 @@ while ($_ = pop @filelist)
 
         #$errorCount += check_ett_registration(\$fileContents, $filename);
 
-        if ($prohibit_cpp_comments && $fileContents =~ m{ \s// }xo)
-        {
-                print STDERR "Error: Found C++ style comments in " .$filename."\n";
-                $errorCount++;
-        }
-
         # Remove all blank lines
         $fileContents =~ s{ ^ \s* $ } []xog;