]> source.dussan.org Git - tigervnc.git/commitdiff
Remove variable length arrays
authorPierre Ossman <ossman@cendio.se>
Wed, 7 Nov 2018 20:36:05 +0000 (21:36 +0100)
committerPierre Ossman <ossman@cendio.se>
Wed, 7 Nov 2018 20:36:05 +0000 (21:36 +0100)
These are not allowed in C++, and have been made optional in C11.
So let's just get rid of them and any issues they may cause.

CMakeLists.txt
common/rfb/CMsgReader.cxx
common/rfb/Cursor.cxx
common/rfb/TightDecoder.cxx
tests/encperf.cxx
vncviewer/gettext.h
vncviewer/parameters.cxx

index 4fb336008c71ca8dbd3460d5f9c04d3ed062da5c..f87fc252a2cd7dd8e8b4c301b9ab7fb37ea7ef11 100644 (file)
@@ -76,8 +76,8 @@ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wformat=2")
 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wformat=2")
 # Make sure we catch these issues whilst developing
 IF(CMAKE_BUILD_TYPE MATCHES Debug)
-  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror")
-  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")
+  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror -Werror=vla")
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror -Werror=vla")
 ENDIF()
 
 option(ENABLE_ASAN "Enable address sanitizer support" OFF)
index 1d359d2c74e22b1a682e53e037d48281fd969036..e42546d4aa2c2839024d7241d70d38ae994d05de 100644 (file)
@@ -210,7 +210,7 @@ void CMsgReader::readSetXCursor(int width, int height, const Point& hotspot)
   if (width > maxCursorSize || height > maxCursorSize)
     throw Exception("Too big cursor");
 
-  rdr::U8 buf[width*height*4];
+  rdr::U8Array rgba(width*height*4);
 
   if (width * height > 0) {
     rdr::U8 pr, pg, pb;
@@ -235,7 +235,7 @@ void CMsgReader::readSetXCursor(int width, int height, const Point& hotspot)
     is->readBytes(mask.buf, mask_len);
 
     int maskBytesPerRow = (width+7)/8;
-    out = buf;
+    out = rgba.buf;
     for (y = 0;y < height;y++) {
       for (x = 0;x < width;x++) {
         int byte = y * maskBytesPerRow + x / 8;
@@ -261,7 +261,7 @@ void CMsgReader::readSetXCursor(int width, int height, const Point& hotspot)
     }
   }
 
-  handler->setCursor(width, height, hotspot, buf);
+  handler->setCursor(width, height, hotspot, rgba.buf);
 }
 
 void CMsgReader::readSetCursor(int width, int height, const Point& hotspot)
@@ -275,7 +275,7 @@ void CMsgReader::readSetCursor(int width, int height, const Point& hotspot)
   rdr::U8Array mask(mask_len);
 
   int x, y;
-  rdr::U8 buf[width*height*4];
+  rdr::U8Array rgba(width*height*4);
   rdr::U8* in;
   rdr::U8* out;
 
@@ -284,7 +284,7 @@ void CMsgReader::readSetCursor(int width, int height, const Point& hotspot)
 
   int maskBytesPerRow = (width+7)/8;
   in = data.buf;
-  out = buf;
+  out = rgba.buf;
   for (y = 0;y < height;y++) {
     for (x = 0;x < width;x++) {
       int byte = y * maskBytesPerRow + x / 8;
@@ -302,7 +302,7 @@ void CMsgReader::readSetCursor(int width, int height, const Point& hotspot)
     }
   }
 
-  handler->setCursor(width, height, hotspot, buf);
+  handler->setCursor(width, height, hotspot, rgba.buf);
 }
 
 void CMsgReader::readSetCursorWithAlpha(int width, int height, const Point& hotspot)
index 99df82d6de44312d3f1a27ad4e25d4fe4e2accdd..d0feaa5549226cdf4697d6ca8ceb3278ce0c6803 100644 (file)
@@ -76,7 +76,7 @@ static unsigned short srgb_to_lin(unsigned char srgb)
 }
 
 // Floyd-Steinberg dithering
-static void dither(int width, int height, int* data)
+static void dither(int width, int height, rdr::U16* data)
 {
   for (int y = 0; y < height; y++) {
     for (int x_ = 0; x_ < width; x_++) {
@@ -122,31 +122,33 @@ static void dither(int width, int height, int* data)
 rdr::U8* Cursor::getBitmap() const
 {
   // First step is converting to luminance
-  int luminance[width()*height()];
-  int *lum_ptr = luminance;
+  rdr::U16Array luminance(width()*height());
+  rdr::U16 *lum_ptr = luminance.buf;
   const rdr::U8 *data_ptr = data;
   for (int y = 0; y < height(); y++) {
     for (int x = 0; x < width(); x++) {
+      rdr::U32 lum;
+
       // Use BT.709 coefficients for grayscale
-      *lum_ptr = 0;
-      *lum_ptr += (int)srgb_to_lin(data_ptr[0]) * 6947;  // 0.2126
-      *lum_ptr += (int)srgb_to_lin(data_ptr[1]) * 23436; // 0.7152
-      *lum_ptr += (int)srgb_to_lin(data_ptr[2]) * 2366;  // 0.0722
-      *lum_ptr /= 32768;
+      lum = 0;
+      lum += (rdr::U32)srgb_to_lin(data_ptr[0]) * 6947;  // 0.2126
+      lum += (rdr::U32)srgb_to_lin(data_ptr[1]) * 23436; // 0.7152
+      lum += (rdr::U32)srgb_to_lin(data_ptr[2]) * 2366;  // 0.0722
+      lum /= 32768;
 
-      lum_ptr++;
+      *lum_ptr++ = lum;
       data_ptr += 4;
     }
   }
 
   // Then diterhing
-  dither(width(), height(), luminance);
+  dither(width(), height(), luminance.buf);
 
   // Then conversion to a bit mask
   rdr::U8Array source((width()+7)/8*height());
   memset(source.buf, 0, (width()+7)/8*height());
   int maskBytesPerRow = (width() + 7) / 8;
-  lum_ptr = luminance;
+  lum_ptr = luminance.buf;
   data_ptr = data;
   for (int y = 0; y < height(); y++) {
     for (int x = 0; x < width(); x++) {
@@ -165,25 +167,24 @@ rdr::U8* Cursor::getBitmap() const
 rdr::U8* Cursor::getMask() const
 {
   // First step is converting to integer array
-  int alpha[width()*height()];
-  int *alpha_ptr = alpha;
+  rdr::U16Array alpha(width()*height());
+  rdr::U16 *alpha_ptr = alpha.buf;
   const rdr::U8 *data_ptr = data;
   for (int y = 0; y < height(); y++) {
     for (int x = 0; x < width(); x++) {
-      *alpha_ptr = (int)data_ptr[3] * 65535 / 255;
-      alpha_ptr++;
+      *alpha_ptr++ = (rdr::U32)data_ptr[3] * 65535 / 255;
       data_ptr += 4;
     }
   }
 
   // Then diterhing
-  dither(width(), height(), alpha);
+  dither(width(), height(), alpha.buf);
 
   // Then conversion to a bit mask
   rdr::U8Array mask((width()+7)/8*height());
   memset(mask.buf, 0, (width()+7)/8*height());
   int maskBytesPerRow = (width() + 7) / 8;
-  alpha_ptr = alpha;
+  alpha_ptr = alpha.buf;
   data_ptr = data;
   for (int y = 0; y < height(); y++) {
     for (int x = 0; x < width(); x++) {
index cc786f5b8cb4f8bee556d775c823248712736bcd..c5470534502a7060f34e0dc361f2b5c2b8982ab5 100644 (file)
@@ -266,15 +266,16 @@ void TightDecoder::decodeRect(const Rect& r, const void* buffer,
       buflen -= 1;
 
       if (pf.is888()) {
-        rdr::U8 tightPalette[palSize * 3];
+        size_t len = palSize * 3;
+        rdr::U8Array tightPalette(len);
 
-        assert(buflen >= sizeof(tightPalette));
+        assert(buflen >= sizeof(len));
 
-        memcpy(tightPalette, bufptr, sizeof(tightPalette));
-        bufptr += sizeof(tightPalette);
-        buflen -= sizeof(tightPalette);
+        memcpy(tightPalette.buf, bufptr, len);
+        bufptr += len;
+        buflen -= len;
 
-        pf.bufferFromRGB(palette, tightPalette, palSize);
+        pf.bufferFromRGB(palette, tightPalette.buf, palSize);
       } else {
         size_t len;
 
index 4e7038fdd5bb5c86eda4c3f2f3401533fcc7be45..733d55b6df53c841d45390e7bfe256b53ebb1b3e 100644 (file)
@@ -423,8 +423,9 @@ int main(int argc, char **argv)
   }
 
   int runCount = count;
-  struct stats runs[runCount];
-  double values[runCount], dev[runCount];
+  struct stats *runs = new struct stats[runCount];
+  double *values = new double[runCount];
+  double *dev = new double[runCount];
   double median, meddev;
 
   if (fn == NULL) {
index 27c754c68116f3cb8b6d18886ba826be6fe668b6..768a699527f4e0d4542ebc6e5e7041aa4464092d 100644 (file)
@@ -184,7 +184,7 @@ npgettext_aux (const char *domain,
 
 #include <string.h>
 
-#if (((__GNUC__ >= 3 || __GNUG__ >= 2) && !defined __STRICT_ANSI__) \
+#if (((__GNUC__ >= 3 || __GNUG__ >= 2) && !defined __STRICT_ANSI__ && !defined __cplusplus) \
      /* || __STDC_VERSION__ == 199901L
         || (__STDC_VERSION__ >= 201112L && !defined __STDC_NO_VLA__) */ )
 # define _LIBGETTEXT_HAVE_VARIABLE_SIZE_ARRAYS 1
index 51cce3d715e03f94b6e4fefa3b65a486cc13b799..f611fd0bbbdece080e06927cf7617779740ce632 100644 (file)
@@ -325,9 +325,10 @@ static void setKeyInt(const char *_name, const int _value, HKEY* hKey) {
 
 static bool getKeyString(const char* _name, char* dest, size_t destSize, HKEY* hKey) {
   
-  DWORD buffersize = 256;
-  WCHAR value[destSize];
+  const DWORD buffersize = 256;
   wchar_t name[buffersize];
+  WCHAR* value;
+  DWORD valuesize;
 
   unsigned size = fl_utf8towc(_name, strlen(_name)+1, name, buffersize);
   if (size >= buffersize) {
@@ -335,8 +336,11 @@ static bool getKeyString(const char* _name, char* dest, size_t destSize, HKEY* h
     return false;
   }
 
-  LONG res = RegQueryValueExW(*hKey, name, 0, NULL, (LPBYTE)value, &buffersize);
+  value = new WCHAR[destSize];
+  valuesize = destSize;
+  LONG res = RegQueryValueExW(*hKey, name, 0, NULL, (LPBYTE)value, &valuesize);
   if (res != ERROR_SUCCESS){
+    delete [] value;
     if (res == ERROR_FILE_NOT_FOUND) {
       // The value does not exist, defaults will be used.
     } else {
@@ -346,18 +350,19 @@ static bool getKeyString(const char* _name, char* dest, size_t destSize, HKEY* h
     return false;
   }
   
-  char utf8val[destSize];
-  size = fl_utf8fromwc(utf8val, sizeof(utf8val), value, wcslen(value)+1);
-  if (size >= sizeof(utf8val)) {
+  char* utf8val = new char[destSize];
+  size = fl_utf8fromwc(utf8val, destSize, value, wcslen(value)+1);
+  delete [] value;
+  if (size >= destSize) {
+    delete [] utf8val;
     vlog.error(_("The parameter %s was too large to read from the registry"), _name);
     return false;
   }
-  const char *ret = utf8val;
   
-  if(decodeValue(ret, dest, destSize))
-    return true;
-  else 
-    return false;
+  bool ret = decodeValue(utf8val, dest, destSize);
+  delete [] utf8val;
+
+  return ret;
 }