Преглед изворни кода

measure_bandwidth_between_cpus_and_dev() : dynamically allocating arrays, so that we do not statically declare an array of size 0.

It is forbidden by the C99 standard (cf. 6.7.5.2 "Array declarators" of the draft).

[scan-build] Declared variable-length array (VLA) has zero size
Cyril Roelandt пре 13 година
родитељ
комит
dcdb5343ce
1 измењених фајлова са 23 додато и 4 уклоњено
  1. 23 4
      src/core/perfmodel/perfmodel_bus.c

+ 23 - 4
src/core/perfmodel/perfmodel_bus.c

@@ -369,11 +369,23 @@ static void measure_bandwidth_between_cpus_and_dev(int dev, struct dev_timing *d
 	 * bank. */
 	const unsigned no_node_obj_was_found = (nnuma_nodes == 0);
 
-	unsigned is_available_per_numa_node[nnuma_nodes];
-	double dev_timing_htod_per_numa_node[nnuma_nodes];
-	double dev_timing_dtoh_per_numa_node[nnuma_nodes];
+	unsigned *is_available_per_numa_node = NULL;
+	double *dev_timing_htod_per_numa_node = NULL;
+	double *dev_timing_dtoh_per_numa_node = NULL;
 
-	memset(is_available_per_numa_node, 0, nnuma_nodes*sizeof(unsigned));
+	if (!no_node_obj_was_found)
+	{
+		is_available_per_numa_node = malloc(nnuma_nodes * sizeof(unsigned));
+		STARPU_ASSERT(is_available_per_numa_node);
+
+		dev_timing_htod_per_numa_node = malloc(nnuma_nodes * sizeof(double));
+		STARPU_ASSERT(dev_timing_htod_per_numa_node);
+
+		dev_timing_dtoh_per_numa_node = malloc(nnuma_nodes * sizeof(double));
+		STARPU_ASSERT(dev_timing_dtoh_per_numa_node);
+
+		memset(is_available_per_numa_node, 0, nnuma_nodes*sizeof(unsigned));
+	}
 #endif
 
 	unsigned cpu;
@@ -424,6 +436,13 @@ static void measure_bandwidth_between_cpus_and_dev(int dev, struct dev_timing *d
 		}
 #endif
         }
+
+	if (!no_node_obj_was_found)
+	{
+		free(is_available_per_numa_node);
+		free(dev_timing_htod_per_numa_node);
+		free(dev_timing_dtoh_per_numa_node);
+	}
 }
 
 static void measure_bandwidth_between_host_and_dev(int dev, double *dev_timing_htod, double *dev_timing_dtoh,