Skip to content
Snippets Groups Projects
Commit 0e1e8c65 authored by Marvin Häuser's avatar Marvin Häuser
Browse files

simulator: fix variadic iteration UB

The current logic calls va_arg() once after the actual last argument has
been retrieved. While this should usually not cause real-world problems,
it is undefined behaviour caught by AddressSanitizer.
parent a488a6a8
No related branches found
No related tags found
1 merge request!477[WIP] simulation code generation fixes
...@@ -71,15 +71,14 @@ public: ...@@ -71,15 +71,14 @@ public:
SizedParameter(){ SizedParameter(){
} }
SizedParameter(const T& ip1 ...){ SizedParameter(const T ip1 ...){
//#if size>0 //#if size>0
if (size!=0){ if (size!=0){
T arg=ip1;
va_list args; // argument list va_list args; // argument list
va_start(args, ip1); // initialize args va_start(args, ip1); // initialize args
for (unsigned int i=0;i<size;i++){ _p[0]=ip1;
_p[i]=arg; for (unsigned int i=1;i<size;i++){
arg=va_arg(args, T); _p[i]=va_arg(args, T);
} }
} }
//#endif //#endif
...@@ -143,12 +142,11 @@ public: ...@@ -143,12 +142,11 @@ public:
} }
/* template <typename T, int size> void SizedParameter<T,size>::setP(T ip1 ...){ /* template <typename T, int size> void SizedParameter<T,size>::setP(T ip1 ...){
T arg=ip1;
va_list args; // argument list va_list args; // argument list
va_start(args, ip1); // initialize args va_start(args, ip1); // initialize args
for (unsigned int i=0;i<size;i++){ _p[0]=ip1;
_p[i]=arg; for (unsigned int i=1;i<size;i++){
arg=va_arg(args, T); _p[i]=va_arg(args, T);
} }
}*/ }*/
......
...@@ -72,6 +72,7 @@ Ludovic Apvrille, Renaud Pacalet ...@@ -72,6 +72,7 @@ Ludovic Apvrille, Renaud Pacalet
#include <sys/resource.h> #include <sys/resource.h>
#include <unistd.h> #include <unistd.h>
#include "penalties.h" #include "penalties.h"
#include <assert.h>
#define WRITE_STREAM(s,v) s.write((char*) &v,sizeof(v)); #define WRITE_STREAM(s,v) s.write((char*) &v,sizeof(v));
...@@ -775,15 +776,15 @@ inline T StringToNum(const std::string& iStr){ ...@@ -775,15 +776,15 @@ inline T StringToNum(const std::string& iStr){
*/ */
template<typename T> template<typename T>
T* array(unsigned int noArgs, T arg1 ...){ T* array(unsigned int noArgs, T arg1 ...){
T arg=arg1; assert(noArgs > 0);
T* newArray; T* newArray;
unsigned int i; unsigned int i;
va_list args; // argument list va_list args; // argument list
va_start(args, arg1); // initialize args va_start(args, arg1); // initialize args
newArray=new T[noArgs]; newArray=new T[noArgs];
for (i=0;i<noArgs;i++){ newArray[0] = arg1;
newArray[i]=arg; for (i=1;i<noArgs;i++){
arg=va_arg(args, T); newArray[i]=va_arg(args, T);
} }
va_end(args); // clean up args va_end(args); // clean up args
return newArray; return newArray;
......
...@@ -64,6 +64,7 @@ Ludovic Apvrille, Renaud Pacalet ...@@ -64,6 +64,7 @@ Ludovic Apvrille, Renaud Pacalet
#include <netinet/in.h> #include <netinet/in.h>
#include <pthread.h> #include <pthread.h>
#include <dlfcn.h> #include <dlfcn.h>
#include <assert.h>
#define xx__VARS(a1, a2, a3, a4, a5, a6, a7, a8, ...) (void*)&(a1), sizeof(a1), (void*)&(a2), sizeof(a2), (void*)&(a3), sizeof(a3), (void*)&(a4), sizeof(a4), (void*)&(a5), sizeof(a5), (void*)&(a6), sizeof(a6), (void*)&(a7), sizeof(a7), (void*)&(a8), sizeof(a8) #define xx__VARS(a1, a2, a3, a4, a5, a6, a7, a8, ...) (void*)&(a1), sizeof(a1), (void*)&(a2), sizeof(a2), (void*)&(a3), sizeof(a3), (void*)&(a4), sizeof(a4), (void*)&(a5), sizeof(a5), (void*)&(a6), sizeof(a6), (void*)&(a7), sizeof(a7), (void*)&(a8), sizeof(a8)
#define xx__SIZE(a1, a2, a3, a4, a5, a6, a7, a8, ...) sizeof(a1)+sizeof(a2)+sizeof(a3)+sizeof(a4)+sizeof(a5)+sizeof(a6)+sizeof(a7)+sizeof(a8) #define xx__SIZE(a1, a2, a3, a4, a5, a6, a7, a8, ...) sizeof(a1)+sizeof(a2)+sizeof(a3)+sizeof(a4)+sizeof(a5)+sizeof(a6)+sizeof(a7)+sizeof(a8)
...@@ -138,15 +139,14 @@ public: ...@@ -138,15 +139,14 @@ public:
*/ */
template<typename T> template<typename T>
T* array(unsigned int noArgs, T arg1 ...){ T* array(unsigned int noArgs, T arg1 ...){
T arg=arg1; assert(noArgs > 0);
T* newArray; T* newArray;
unsigned int i; unsigned int i;
va_list args; // argument list va_list args; // argument list
va_start(args, arg1); // initialize args va_start(args, arg1); // initialize args
newArray=new T[noArgs]; newArray=new T[noArgs];
for (i=0;i<noArgs;i++){ for (i=1;i<noArgs;i++){
newArray[i]=arg; newArray[i]=va_arg(args, T);
arg=va_arg(args, T);
} }
va_end(args); // clean up args va_end(args); // clean up args
return newArray; return newArray;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment