Просмотр исходного кода

still on the search for bugs in encode/decode

Leon Urbas лет назад: 11
Родитель
Сommit
b084bb8c90
4 измененных файлов с 23 добавлено и 6 удалено
  1. 1 0
      include/ua_basictypes.h
  2. 8 1
      src/ua_basictypes.c
  3. 5 2
      tests/Makefile.am
  4. 9 3
      tool/generate_namespace.py

+ 1 - 0
include/ua_basictypes.h

@@ -193,6 +193,7 @@ typedef struct T_UA_VTable {
 	UA_Int32 (*encodeBinary)(void const * src, UA_Int32* pos, UA_ByteString* dst);
 	UA_Int32 (*new)(void ** p);
 	UA_Int32 (*delete)(void * p);
+	UA_Byte* name;
 } UA_VTable;
 
 /* VariantBinaryEncoding - Part: 6, Chapter: 5.2.2.16, Page: 22 */

+ 8 - 1
src/ua_basictypes.c

@@ -290,7 +290,9 @@ UA_TYPE_METHOD_NEW_DEFAULT(UA_UInt64)
 /** UA_Float - IEE754 32bit float with biased exponent */
 UA_TYPE_METHOD_CALCSIZE_SIZEOF(UA_Float)
 // FIXME: Implement NaN, Inf and Zero(s)
+UA_Byte UA_FLOAT_ZERO[] = {0x00,0x00,0x00,0x00};
 UA_TYPE_START_DECODEBINARY(UA_Float)
+	if (memcmp(&(src->data[*pos]),UA_FLOAT_ZERO,4)==0) { return UA_Int32_decodeBinary(src,pos,(UA_Int32*)dst); }
 	UA_Float mantissa;
 	mantissa = (UA_Float) (src->data[*pos] & 0xFF);							// bits 0-7
 	mantissa = (mantissa / 256.0 ) + (UA_Float) (src->data[*pos+1] & 0xFF); 	// bits 8-15
@@ -324,7 +326,9 @@ UA_TYPE_METHOD_NEW_DEFAULT(UA_Float)
 /** UA_Float - IEE754 64bit float with biased exponent*/
 UA_TYPE_METHOD_CALCSIZE_SIZEOF(UA_Double)
 // FIXME: Implement NaN, Inf and Zero(s)
+UA_Byte UA_DOUBLE_ZERO[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
 UA_TYPE_START_DECODEBINARY(UA_Double)
+	if (memcmp(&(src->data[*pos]),UA_DOUBLE_ZERO,8)==0) { return UA_Int64_decodeBinary(src,pos,(UA_Int64*)dst); }
 	UA_Double mantissa;
 	mantissa = (UA_Double) (src->data[*pos] & 0xFF);							// bits 0-7
 	mantissa = (mantissa / 256.0 ) + (UA_Double) (src->data[*pos+1] & 0xFF); 	// bits 8-15
@@ -847,7 +851,8 @@ UA_Int32 UA_NodeId_compare(UA_NodeId *n1, UA_NodeId *n2) {
 UA_Int32 UA_NodeId_init(UA_NodeId* p){
 	if(p==UA_NULL)return UA_ERROR;
 	p->encodingByte = 0;
-	p->identifier.numeric = 0;
+	p->identifier.string.length = 0;
+	p->identifier.string.data = UA_NULL;
 	p->namespace = 0;
 	return UA_SUCCESS;
 }
@@ -902,7 +907,9 @@ UA_Int32 UA_ExpandedNodeId_deleteMembers(UA_ExpandedNodeId* p) {
 }
 UA_Int32 UA_ExpandedNodeId_init(UA_ExpandedNodeId* p){
 	if(p==UA_NULL)return UA_ERROR;
+	UA_NodeId_init(&(p->nodeId));
 	UA_String_init(&(p->namespaceUri));
+	p->serverIndex = 0;
 	return UA_SUCCESS;
 }
 UA_TYPE_METHOD_NEW_DEFAULT(UA_ExpandedNodeId)

+ 5 - 2
tests/Makefile.am

@@ -3,7 +3,7 @@ TESTS=
 UNIT_TESTS=
 check_PROGRAMS=
 
-UNIT_TESTS += check_stack check_list check_indexedList check_builtin check_namespace check_encode check_decode check_create check_delete
+UNIT_TESTS += check_stack check_list check_indexedList check_builtin check_namespace check_encode check_decode check_create check_delete check_memory
 TESTS += $(UNIT_TESTS)
 check_PROGRAMS += $(UNIT_TESTS)
 
@@ -12,7 +12,10 @@ TESTS_ENVIRONMENT_MEM="libtool --mode=execute valgrind --leak-check=full --quiet
 .PHONY: check-mem
 check-mem:
 	$(MAKE) $(AM_MAKEFLAGS) check TESTS="$(UNIT_TESTS)" TESTS_ENVIRONMENT=$(TESTS_ENVIRONMENT_MEM)
-		
+
+clean-local:
+	rm -rf *.gcda *.gcdo *.gcno 
+	rm -rf coverage || true;
 # --- no changes beyond this line needed ---
 INCLUDE = @CHECK_CFLAGS@ -I$(top_builddir)/src -I$(top_builddir)/include
 LDADD = $(top_builddir)/lib/libopen62541.a @CHECK_LIBS@

+ 9 - 3
tool/generate_namespace.py

@@ -120,9 +120,15 @@ for row in rows2:
 
     print('#define '+name.upper()+'_NS0 '+row[1], file=fh)
 
-    print("\t{" + row[1] + ", (UA_Int32(*)(void const*)) " + name + "_calcSize, (UA_Int32(*)(UA_ByteString const*,UA_Int32*,void*)) " + name + "_decodeBinary, (UA_Int32(*)(void const*,UA_Int32*,UA_ByteString*))" + name + "_encodeBinary, (UA_Int32(*)(void **))" + name + "_new, (UA_Int32(*)(void *))" + name + "_delete},",end='\n',file=fc) 
-
-print("\t{0,UA_NULL,UA_NULL,UA_NULL,UA_NULL,UA_NULL}\n};",file=fc)
+    print("\t{" + row[1] + 
+          ",(UA_Int32(*)(void const*))"+name+"_calcSize" + 
+          ",(UA_Int32(*)(UA_ByteString const*,UA_Int32*,void*))"+name+ "_decodeBinary" +
+          ",(UA_Int32(*)(void const*,UA_Int32*,UA_ByteString*))"+name+"_encodeBinary"+
+          ",(UA_Int32(*)(void **))"+name+"_new"+
+          ",(UA_Int32(*)(void *))"+name+"_delete"+
+          ',(UA_Byte*)"'+name+'"},',end='\n',file=fc) 
+
+print('\t{0,UA_NULL,UA_NULL,UA_NULL,UA_NULL,UA_NULL,(UA_Byte*)"undefined"}\n};',file=fc)
 print('#endif /* OPCUA_NAMESPACE_0_H_ */', end='\n', file=fh)
 fh.close()
 fc.close()