Julius Pfrommer 9 lat temu
rodzic
commit
a3be08ae1a

+ 1 - 0
examples/logger_stdout.c

@@ -6,6 +6,7 @@
 #include <stdio.h>
 #include <stdarg.h>
 #include "logger_stdout.h"
+#include "ua_types_generated_encoding_binary.h"
 
 const char *LogLevelNames[6] = {"trace", "debug", "info", "warning", "error", "fatal"};
 const char *LogCategoryNames[6] = {"network", "channel", "session", "server", "client", "userland"};

+ 1 - 0
examples/server_readspeed.c

@@ -79,6 +79,7 @@ int main(int argc, char** argv) {
 
         offset = 0;
         retval |= UA_decodeBinary(&request_msg, &offset, &rq, &UA_TYPES[UA_TYPES_READREQUEST]);
+        //assert(retval != UA_STATUSCODE_GOOD);
 
         Service_Read(server, &adminSession, &rq, &rr);
 

+ 1 - 1
src/client/ua_client_highlevel.c

@@ -209,7 +209,7 @@ UA_Client_call(UA_Client *client, const UA_NodeId objectId, const UA_NodeId meth
         *output = response.results[0].outputArguments;
         *outputSize = response.results[0].outputArgumentsSize;
         response.results[0].outputArguments = NULL;
-        response.results[0].outputArgumentsSize = -1;
+        response.results[0].outputArgumentsSize = 0;
     }
     UA_CallResponse_deleteMembers(&response);
     return retval;

+ 4 - 4
src/server/ua_server.c

@@ -316,9 +316,9 @@ readStatus(void *handle, const UA_NodeId nodeid, UA_Boolean sourceTimeStamp,
     status->secondsTillShutdown = 0;
 
     value->value.type = &UA_TYPES[UA_TYPES_SERVERSTATUSDATATYPE];
-    value->value.arrayLength = -1;
+    value->value.arrayLength = 0;
     value->value.data = status;
-    value->value.arrayDimensionsSize = -1;
+    value->value.arrayDimensionsSize = 0;
     value->value.arrayDimensions = NULL;
     value->hasValue = UA_TRUE;
     if(sourceTimeStamp) {
@@ -1084,7 +1084,7 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
     copyNames((UA_Node*)state, "State");
     state->nodeId.identifier.numeric = UA_NS0ID_SERVER_SERVERSTATUS_STATE;
     state->value.variant.value.type = &UA_TYPES[UA_TYPES_SERVERSTATE];
-    state->value.variant.value.arrayLength = -1;
+    state->value.variant.value.arrayLength = 0;
     state->value.variant.value.data = stateEnum; // points into the other object.
     addNodeInternal(server, (UA_Node*)state, UA_NODEID_NUMERIC(0, UA_NS0ID_SERVER_SERVERSTATUS),
                     nodeIdHasComponent);
@@ -1301,7 +1301,7 @@ __UA_Server_readAttribute(UA_Server *server, const UA_NodeId nodeId,
     else {
         memcpy(v, dv.value.data, dv.value.type->memSize);
         dv.value.data = NULL;
-        dv.value.arrayLength = -1;
+        dv.value.arrayLength = 0;
         UA_Variant_deleteMembers(&dv.value);
     }
     return UA_STATUSCODE_GOOD;

+ 5 - 5
src/server/ua_services_call.c

@@ -56,17 +56,17 @@ statisfySignature(UA_Variant *var, UA_Argument arg) {
             return UA_STATUSCODE_BADINVALIDARGUMENT;
         
         //variants do not always encode the dimension flag (e.g. 1d array)
-       if(var->arrayDimensionsSize==-1 && arg.arrayDimensionsSize == 1 &&
-    		   var->arrayLength > 0 && arg.arrayDimensions[0] == (UA_UInt32)var->arrayLength ){
+       if(!var->arrayDimensions && arg.arrayDimensionsSize == 1 &&
+          arg.arrayDimensions[0] == var->arrayLength) {
     	   return UA_STATUSCODE_GOOD;
-       }else{
+       } else {
          if(arg.valueRank >= 1 && var->arrayDimensionsSize != arg.arrayDimensionsSize)
             return UA_STATUSCODE_BADINVALIDARGUMENT;
          if(arg.arrayDimensionsSize >= 1) {
             if(arg.arrayDimensionsSize != var->arrayDimensionsSize)
                 return UA_STATUSCODE_BADINVALIDARGUMENT;
-            for(UA_Int32 i = 0; i < arg.arrayDimensionsSize; i++) {
-                if(arg.arrayDimensions[i] != (UA_UInt32) var->arrayDimensions[i])
+            for(size_t i = 0; i < arg.arrayDimensionsSize; i++) {
+                if(arg.arrayDimensions[i] != var->arrayDimensions[i])
                     return UA_STATUSCODE_BADINVALIDARGUMENT;
             }
          }

+ 5 - 4
src/server/ua_services_nodemanagement.c

@@ -10,9 +10,10 @@
 /* Add Node */
 /************/
 
-void UA_Server_addExistingNode(UA_Server *server, UA_Session *session, UA_Node *node,
-                               const UA_NodeId *parentNodeId, const UA_NodeId *referenceTypeId,
-                               UA_AddNodesResult *result) {
+void
+UA_Server_addExistingNode(UA_Server *server, UA_Session *session, UA_Node *node,
+                          const UA_NodeId *parentNodeId, const UA_NodeId *referenceTypeId,
+                          UA_AddNodesResult *result) {
     if(node->nodeId.namespaceIndex >= server->namespacesSize) {
         result->statusCode = UA_STATUSCODE_BADNODEIDINVALID;
         return;
@@ -924,7 +925,7 @@ deleteOneWayReference(UA_Server *server, UA_Session *session, UA_Node *node,
     if(!edited)
         return UA_STATUSCODE_UNCERTAINREFERENCENOTDELETED;
     /* we removed the last reference */
-    if(node->referencesSize <= 0 && node->references)
+    if(node->referencesSize == 0 && node->references)
         UA_free(node->references);
     return UA_STATUSCODE_GOOD;;
 }

+ 1 - 3
src/server/ua_services_view.c

@@ -9,8 +9,6 @@ fillReferenceDescription(UA_NodeStore *ns, const UA_Node *curr, UA_ReferenceNode
                          UA_UInt32 mask, UA_ReferenceDescription *descr) {
     UA_ReferenceDescription_init(descr);
     UA_StatusCode retval = UA_NodeId_copy(&curr->nodeId, &descr->nodeId.nodeId);
-    descr->nodeId.serverIndex = 0;
-    descr->nodeId.namespaceUri.length = -1;
 
     if(mask & UA_BROWSERESULTMASK_REFERENCETYPEID)
         retval |= UA_NodeId_copy(&ref->referenceTypeId, &descr->referenceTypeId);
@@ -611,7 +609,7 @@ void Service_TranslateBrowsePathsToNodeIds_single(UA_Server *server, UA_Session
     if(result->statusCode != UA_STATUSCODE_GOOD) {
         UA_Array_delete(result->targets, result->targetsSize, &UA_TYPES[UA_TYPES_BROWSEPATHTARGET]);
         result->targets = NULL;
-        result->targetsSize = -1;
+        result->targetsSize = 0;
     }
 }
 

+ 1 - 0
src/ua_connection.c

@@ -1,6 +1,7 @@
 #include "ua_util.h"
 #include "ua_connection.h"
 #include "ua_types_encoding_binary.h"
+#include "ua_types_generated_encoding_binary.h"
 #include "ua_securechannel.h"
 
 // max message size is 64k

+ 1 - 0
src/ua_securechannel.c

@@ -2,6 +2,7 @@
 #include "ua_securechannel.h"
 #include "ua_session.h"
 #include "ua_types_encoding_binary.h"
+#include "ua_types_generated_encoding_binary.h"
 #include "ua_transport_generated_encoding_binary.h"
 
 void UA_SecureChannel_init(UA_SecureChannel *channel) {

+ 8 - 8
src/ua_session.c

@@ -3,11 +3,11 @@
 #include "ua_statuscodes.h"
 
 UA_Session anonymousSession = {
-    .clientDescription =  {.applicationUri = {-1, NULL}, .productUri = {-1, NULL},
-                           .applicationName = {.locale = {-1, NULL}, .text = {-1, NULL}},
+    .clientDescription =  {.applicationUri = {0, NULL}, .productUri = {0, NULL},
+                           .applicationName = {.locale = {0, NULL}, .text = {0, NULL}},
                            .applicationType = UA_APPLICATIONTYPE_CLIENT,
-                           .gatewayServerUri = {-1, NULL}, .discoveryProfileUri = {-1, NULL},
-                           .discoveryUrlsSize = -1, .discoveryUrls = NULL},
+                           .gatewayServerUri = {0, NULL}, .discoveryProfileUri = {0, NULL},
+                           .discoveryUrlsSize = 0, .discoveryUrls = NULL},
     .sessionName = {sizeof("Anonymous Session")-1, (UA_Byte*)"Anonymous Session"},
     .authenticationToken = {.namespaceIndex = 0, .identifierType = UA_NODEIDTYPE_NUMERIC,
                             .identifier.numeric = 0}, 
@@ -17,11 +17,11 @@ UA_Session anonymousSession = {
     .continuationPoints = {NULL}};
 
 UA_Session adminSession = {
-    .clientDescription =  {.applicationUri = {-1, NULL}, .productUri = {-1, NULL},
-                           .applicationName = {.locale = {-1, NULL}, .text = {-1, NULL}},
+    .clientDescription =  {.applicationUri = {0, NULL}, .productUri = {0, NULL},
+                           .applicationName = {.locale = {0, NULL}, .text = {0, NULL}},
                            .applicationType = UA_APPLICATIONTYPE_CLIENT,
-                           .gatewayServerUri = {-1, NULL}, .discoveryProfileUri = {-1, NULL},
-                           .discoveryUrlsSize = -1, .discoveryUrls = NULL},
+                           .gatewayServerUri = {0, NULL}, .discoveryProfileUri = {0, NULL},
+                           .discoveryUrlsSize = 0, .discoveryUrls = NULL},
     .sessionName = {sizeof("Administrator Session")-1, (UA_Byte*)"Administrator Session"},
     .authenticationToken = {.namespaceIndex = 0, .identifierType = UA_NODEIDTYPE_NUMERIC,
                             .identifier.numeric = 1},

+ 14 - 65
src/ua_types.c

@@ -603,7 +603,7 @@ static UA_StatusCode UA_copyFixedSize(const void *src, void *dst, const UA_DataT
 }
 
 typedef UA_StatusCode (*UA_copySignature)(const void *src, void *dst, const UA_DataType *type);
-static const UA_copySignature copyJumpTable[UA_BUILTIN_TYPES_COUNT * 2] = {
+static const UA_copySignature copyJumpTable[UA_BUILTIN_TYPES_COUNT + 1] = {
     (UA_copySignature)UA_copyFixedSize, // Boolean
     (UA_copySignature)UA_copyFixedSize, // SByte
     (UA_copySignature)UA_copyFixedSize, // Byte
@@ -629,32 +629,7 @@ static const UA_copySignature copyJumpTable[UA_BUILTIN_TYPES_COUNT * 2] = {
     (UA_copySignature)DataValue_copy,
     (UA_copySignature)variant_copy,
     (UA_copySignature)DiagnosticInfo_copy,
-    /* Only UA_copy from here on. Double the table size. */
     (UA_copySignature)UA_copy,
-    (UA_copySignature)UA_copy,
-    (UA_copySignature)UA_copy,
-    (UA_copySignature)UA_copy,
-    (UA_copySignature)UA_copy,
-    (UA_copySignature)UA_copy,
-    (UA_copySignature)UA_copy,
-    (UA_copySignature)UA_copy,
-    (UA_copySignature)UA_copy,
-    (UA_copySignature)UA_copy,
-    (UA_copySignature)UA_copy,
-    (UA_copySignature)UA_copy,
-    (UA_copySignature)UA_copy,
-    (UA_copySignature)UA_copy,
-    (UA_copySignature)UA_copy,
-    (UA_copySignature)UA_copy,
-    (UA_copySignature)UA_copy,
-    (UA_copySignature)UA_copy,
-    (UA_copySignature)UA_copy,
-    (UA_copySignature)UA_copy,
-    (UA_copySignature)UA_copy,
-    (UA_copySignature)UA_copy,
-    (UA_copySignature)UA_copy,
-    (UA_copySignature)UA_copy,
-    (UA_copySignature)UA_copy
 };
 
 UA_StatusCode UA_copy(const void *src, void *dst, const UA_DataType *type) {
@@ -672,18 +647,17 @@ UA_StatusCode UA_copy(const void *src, void *dst, const UA_DataType *type) {
         if(!member->isArray) {
             ptrs += member->padding;
             ptrd += member->padding;
-            size_t func_index = (type->typeIndex % UA_BUILTIN_TYPES_COUNT) +
-                (!type->builtin * UA_BUILTIN_TYPES_COUNT);
-            retval |= copyJumpTable[func_index]((const void*)ptrs, (void*)ptrd, memberType);
+            size_t fi = type->builtin ? type->typeIndex : UA_BUILTIN_TYPES_COUNT;
+            retval |= copyJumpTable[fi]((const void*)ptrs, (void*)ptrd, memberType);
             ptrs += memberType->memSize;
             ptrd += memberType->memSize;
         } else {
-            ptrs += (member->padding >> 3);
-            ptrd += (member->padding >> 3);
+            ptrs += member->padding;
+            ptrd += member->padding;
             size_t *dst_size = (size_t*)ptrd;
             const size_t size = *((const size_t*)ptrs);
-            ptrs += sizeof(size_t) + (member->padding & 0x07);
-            ptrd += sizeof(size_t) + (member->padding & 0x07);
+            ptrs += sizeof(size_t);
+            ptrd += sizeof(size_t);
             retval |= UA_Array_copy(*(void* const*)ptrs, size, (void**)ptrd, memberType);
             *dst_size = size;
             if(retval != UA_STATUSCODE_GOOD)
@@ -699,7 +673,7 @@ UA_StatusCode UA_copy(const void *src, void *dst, const UA_DataType *type) {
 
 typedef void (*UA_deleteMembersSignature)(void *p, const UA_DataType *type);
 static void nopDeleteMembers(void *p, const UA_DataType *type) { }
-static const UA_deleteMembersSignature deleteMembersJumpTable[UA_BUILTIN_TYPES_COUNT * 2] = {
+static const UA_deleteMembersSignature deleteMembersJumpTable[UA_BUILTIN_TYPES_COUNT + 1] = {
     (UA_deleteMembersSignature)nopDeleteMembers, // Boolean
     (UA_deleteMembersSignature)nopDeleteMembers, // SByte
     (UA_deleteMembersSignature)nopDeleteMembers, // Byte
@@ -725,37 +699,13 @@ static const UA_deleteMembersSignature deleteMembersJumpTable[UA_BUILTIN_TYPES_C
     (UA_deleteMembersSignature)DataValue_deleteMembers,
     (UA_deleteMembersSignature)variant_deleteMembers,
     (UA_deleteMembersSignature)DiagnosticInfo_deleteMembers,
-    /* Only UA_deleteMembers from here on. Double the table size. */
-    (UA_deleteMembersSignature)UA_deleteMembers,
     (UA_deleteMembersSignature)UA_deleteMembers,
-    (UA_deleteMembersSignature)UA_deleteMembers,
-    (UA_deleteMembersSignature)UA_deleteMembers,
-    (UA_deleteMembersSignature)UA_deleteMembers,
-    (UA_deleteMembersSignature)UA_deleteMembers,
-    (UA_deleteMembersSignature)UA_deleteMembers,
-    (UA_deleteMembersSignature)UA_deleteMembers,
-    (UA_deleteMembersSignature)UA_deleteMembers,
-    (UA_deleteMembersSignature)UA_deleteMembers,
-    (UA_deleteMembersSignature)UA_deleteMembers,
-    (UA_deleteMembersSignature)UA_deleteMembers,
-    (UA_deleteMembersSignature)UA_deleteMembers,
-    (UA_deleteMembersSignature)UA_deleteMembers,
-    (UA_deleteMembersSignature)UA_deleteMembers,
-    (UA_deleteMembersSignature)UA_deleteMembers,
-    (UA_deleteMembersSignature)UA_deleteMembers,
-    (UA_deleteMembersSignature)UA_deleteMembers,
-    (UA_deleteMembersSignature)UA_deleteMembers,
-    (UA_deleteMembersSignature)UA_deleteMembers,
-    (UA_deleteMembersSignature)UA_deleteMembers,
-    (UA_deleteMembersSignature)UA_deleteMembers,
-    (UA_deleteMembersSignature)UA_deleteMembers,
-    (UA_deleteMembersSignature)UA_deleteMembers,
-    (UA_deleteMembersSignature)UA_deleteMembers
 };
 
 void UA_deleteMembers(void *p, const UA_DataType *type) {
     uintptr_t ptr = (uintptr_t)p;
-    for(size_t i = 0; i < type->membersSize; i++) {
+    UA_Byte membersSize = type->membersSize;
+    for(size_t i = 0; i < membersSize; i++) {
         const UA_DataTypeMember *member = &type->members[i];
         const UA_DataType *memberType;
         if(member->namespaceZero)
@@ -764,14 +714,13 @@ void UA_deleteMembers(void *p, const UA_DataType *type) {
             memberType = &type[member->memberTypeIndex - type->typeIndex];
         if(!member->isArray) {
             ptr += member->padding;
-            size_t func_index = (type->typeIndex % UA_BUILTIN_TYPES_COUNT) +
-                (!type->builtin * UA_BUILTIN_TYPES_COUNT);
-            deleteMembersJumpTable[func_index]((void*)ptr, memberType);
+            size_t fi = type->builtin ? type->typeIndex : UA_BUILTIN_TYPES_COUNT;
+            deleteMembersJumpTable[fi]((void*)ptr, memberType);
             ptr += memberType->memSize;
         } else {
-            ptr += (member->padding >> 3);
+            ptr += member->padding;
             size_t length = *(size_t*)ptr;
-            ptr += sizeof(size_t) + (member->padding & 0x07);
+            ptr += sizeof(size_t);
             UA_Array_delete(*(void**)ptr, length, memberType);
             *(void**)ptr = NULL;
             ptr += sizeof(void*);

Plik diff jest za duży
+ 323 - 316
src/ua_types_encoding_binary.c


+ 10 - 9
tests/check_builtin.c

@@ -313,7 +313,7 @@ START_TEST(UA_String_decodeWithNegativeSizeShallNotAllocateMemoryAndNullPtr) {
     UA_StatusCode retval = UA_String_decodeBinary(&src, &pos, &dst);
     // then
     ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
-    ck_assert_int_eq(dst.length, -1);
+    ck_assert_int_eq(dst.length, 0);
     ck_assert_ptr_eq(dst.data, NULL);
 }
 END_TEST
@@ -330,7 +330,7 @@ START_TEST(UA_String_decodeWithZeroSizeShallNotAllocateMemoryAndNullPtr) {
     // then
     ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
     ck_assert_int_eq(dst.length, 0);
-    ck_assert_ptr_eq(dst.data, NULL);
+    ck_assert_ptr_eq(dst.data, UA_EMPTY_ARRAY_SENTINEL);
 }
 END_TEST
 
@@ -401,7 +401,8 @@ START_TEST(UA_Variant_decodeWithOutArrayFlagSetShallSetVTAndAllocateMemoryForArr
     ck_assert_int_eq(pos, 5);
     //ck_assert_ptr_eq((const void *)dst.type, (const void *)&UA_TYPES[UA_TYPES_INT32]); //does not compile in gcc 4.6
     ck_assert_int_eq((uintptr_t)dst.type, (uintptr_t)&UA_TYPES[UA_TYPES_INT32]); 
-    ck_assert_int_eq(dst.arrayLength, -1);
+    ck_assert_int_eq(dst.arrayLength, 0);
+    ck_assert_int_ne(dst.data, NULL);
     ck_assert_int_eq(*(UA_Int32 *)dst.data, 255);
     // finally
     UA_Variant_deleteMembers(&dst);
@@ -879,12 +880,12 @@ START_TEST(UA_DataValue_encodeShallWorkOnExampleWithoutVariant) {
     src.serverTimestamp = 80;
     src.hasServerTimestamp = UA_TRUE;
 
-    UA_Byte data[] = {  0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,       0x55,
-            0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,       0x55,
-            0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,       0x55 };
+    UA_Byte data[] = { 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+                       0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
+                       0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55 };
     UA_ByteString dst = { 24, data };
 
-    UA_Int32  retval  = 0;
+    UA_Int32 retval = 0;
     size_t pos     = 0;
 
     // when
@@ -912,8 +913,8 @@ START_TEST(UA_DataValue_encodeShallWorkOnExampleWithVariant) {
     src.hasValue = UA_TRUE;
     src.hasServerTimestamp = UA_TRUE;
     src.value.type = &UA_TYPES[UA_TYPES_INT32];
-    src.value.arrayLength  = -1; // one element (encoded as not an array)
-    UA_Int32  vdata  = 45;
+    src.value.arrayLength  = 0; // one element (encoded as not an array)
+    UA_Int32 vdata = 45;
     src.value.data = (void *)&vdata;
 
     UA_Byte data[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

+ 10 - 9
tests/check_memory.c

@@ -26,7 +26,7 @@ START_TEST(arrayCopyShallMakeADeepCopy) {
 	a1[2] = (UA_String){3, (UA_Byte*)"ccc"};
 	// when
 	UA_String *a2;
-	UA_Int32   retval = UA_Array_copy((const void *)a1, (void **)&a2, &UA_TYPES[UA_TYPES_STRING], 3);
+	UA_Int32 retval = UA_Array_copy((const void *)a1, 3, (void **)&a2, &UA_TYPES[UA_TYPES_STRING]);
 	// then
 	ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
 	ck_assert_int_eq(a1[0].length, 1);
@@ -42,7 +42,7 @@ START_TEST(arrayCopyShallMakeADeepCopy) {
 	ck_assert_int_eq(a1[1].data[0], a2[1].data[0]);
 	ck_assert_int_eq(a1[2].data[0], a2[2].data[0]);
 	// finally
-	UA_Array_delete((void *)a2, &UA_TYPES[UA_TYPES_STRING], 3);
+	UA_Array_delete((void *)a2, 3, &UA_TYPES[UA_TYPES_STRING]);
 }
 END_TEST
 
@@ -51,7 +51,7 @@ START_TEST(encodeShallYieldDecode) {
 	UA_ByteString msg1, msg2;
 	size_t pos = 0;
 	void *obj1 = UA_new(&UA_TYPES[_i]);
-	UA_ByteString_newMembers(&msg1, 65000); // fixed buf size
+	msg1 = UA_ByteString_withSize(65000); // fixed buf size
     UA_StatusCode retval = UA_encodeBinary(obj1, &UA_TYPES[_i], &msg1, &pos);
     msg1.length = pos;
 	if(retval != UA_STATUSCODE_GOOD) {
@@ -63,9 +63,10 @@ START_TEST(encodeShallYieldDecode) {
 	// when
 	void *obj2 = UA_new(&UA_TYPES[_i]);
 	pos = 0; retval = UA_decodeBinary(&msg1, &pos, obj2, &UA_TYPES[_i]);
-	ck_assert_msg(retval == UA_STATUSCODE_GOOD, "messages differ idx=%d,nodeid=%i", _i, UA_TYPES[_i].typeId.identifier.numeric);
-	retval = UA_ByteString_newMembers(&msg2, 65000);
-	ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
+	ck_assert_msg(retval == UA_STATUSCODE_GOOD, "could not decode idx=%d,nodeid=%i", _i, UA_TYPES[_i].typeId.identifier.numeric);
+	ck_assert_msg(!memcmp(obj1, obj2, UA_TYPES[_i].memSize), "Decoded structure is not bit-identical idx=%d,nodeid=%i", _i, UA_TYPES[_i].typeId.identifier.numeric);
+    assert(!memcmp(obj1, obj2, UA_TYPES[_i].memSize));
+	msg2 = UA_ByteString_withSize(65000);
 	pos = 0; retval = UA_encodeBinary(obj2, &UA_TYPES[_i], &msg2, &pos);
     msg2.length = pos;
 	ck_assert_int_eq(retval, UA_STATUSCODE_GOOD);
@@ -87,7 +88,7 @@ START_TEST(decodeShallFailWithTruncatedBufferButSurvive) {
 	UA_ByteString msg1;
 	void *obj1 = UA_new(&UA_TYPES[_i]);
 	size_t pos = 0;
-	UA_ByteString_newMembers(&msg1, 65000); // fixed buf size
+	msg1 = UA_ByteString_withSize(65000); // fixed buf size
     UA_StatusCode retval = UA_encodeBinary(obj1, &UA_TYPES[_i], &msg1, &pos);
 	UA_delete(obj1, &UA_TYPES[_i]);
     if(retval != UA_STATUSCODE_GOOD) {
@@ -117,7 +118,7 @@ START_TEST(decodeScalarBasicTypeFromRandomBufferShallSucceed) {
 	UA_ByteString msg1;
 	UA_Int32 retval = UA_STATUSCODE_GOOD;
 	UA_Int32 buflen = 256;
-	UA_ByteString_newMembers(&msg1, buflen); // fixed size
+	msg1 = UA_ByteString_withSize(buflen); // fixed size
 #ifdef _WIN32
 	srand(42);
 #else
@@ -150,7 +151,7 @@ START_TEST(decodeComplexTypeFromRandomBufferShallSurvive) {
 	UA_ByteString msg1;
 	UA_Int32 retval = UA_STATUSCODE_GOOD;
 	UA_Int32 buflen = 256;
-	UA_ByteString_newMembers(&msg1, buflen); // fixed size
+	msg1 = UA_ByteString_withSize(buflen); // fixed size
 #ifdef _WIN32
 	srand(42);
 #else

+ 8 - 12
tools/generate_datatypes.py

@@ -146,7 +146,7 @@ class BuiltinType(Type):
                 ".builtin = UA_TRUE, .fixedSize = UA_FALSE, .zeroCopyable = UA_FALSE, " + \
                 ".membersSize = 1,\n\t.members = {{.memberTypeIndex = UA_TYPES_BYTE, .namespaceZero = UA_TRUE, " + \
                 (".memberName = \"\", " if typeintrospection else "") + \
-                ".padding = offsetof(UA_String, data) - sizeof(size_t), .isArray = UA_TRUE }}, " + \
+                ".padding = 0, .isArray = UA_TRUE }}, " + \
                 ".typeIndex = %s }" % (outname.upper() + "_" + self.name[3:].upper())
 
         if self.name == "UA_ExpandedNodeId":
@@ -259,7 +259,7 @@ class OpaqueType(Type):
             ".memSize = sizeof(" + self.name + "), .fixedSize = UA_FALSE, .zeroCopyable = UA_FALSE, " + \
             ".builtin = UA_FALSE, .membersSize = 1,\n\t.members = {{.memberTypeIndex = UA_TYPES_BYTE," + \
             (".memberName = \"\", " if typeintrospection else "") + \
-            ".namespaceZero = UA_TRUE, .padding = offsetof(UA_String, data) - sizeof(size_t), .isArray = UA_TRUE }}, .typeIndex = %s}" % (outname.upper() + "_" + self.name[3:].upper())
+            ".namespaceZero = UA_TRUE, .padding = 0, .isArray = UA_TRUE }}, .typeIndex = %s}" % (outname.upper() + "_" + self.name[3:].upper())
 
 class StructMember(object):
     def __init__(self, name, memberType, isArray):
@@ -334,8 +334,11 @@ class StructType(Type):
                           ("UA_TRUE, " if args.namespace_id == 0 or member.memberType.name in existing_types else "UA_FALSE, ") + \
                           ".padding = "
 
+                if not member.isArray:
+                    thispos = "offsetof(%s, %s)" % (self.name, member.name)
+                else:
+                    thispos = "offsetof(%s, %sSize)" % (self.name, member.name)
                 before_endpos = "0"
-                thispos = "offsetof(%s, %s)" % (self.name, member.name)
                 if index > 0:
                     if sys.version_info[0] < 3:
                         before = self.members.values()[index-1]
@@ -346,15 +349,8 @@ class StructType(Type):
                         before_endpos += " + sizeof(void*))"
                     else:
                         before_endpos += " + sizeof(%s))" % before.memberType.name
-            
-                if member.isArray:
-                    # the first two bytes are padding for the length index, the last three for the pointer
-                    length_pos = "offsetof(%s, %sSize)" % (self.name, member.name)
-                    if index != 0:
-                        layout += "((%s - %s) << 3) + " % (length_pos, before_endpos)
-                    layout += "(%s - sizeof(size_t) - %s)" % (thispos, length_pos)
-                else:
-                    layout += "%s - %s" % (thispos, before_endpos)
+                layout += "%s - %s" % (thispos, before_endpos)
+
                 layout += ", .isArray = " + ("UA_TRUE" if member.isArray else "UA_FALSE") + " }, "
             layout += "}"
         return layout + "}"