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

Merge remote-tracking branch 'upstream/master' into feature/jassimp-classloader-license

Jesper Smith 8 лет назад
Родитель
Сommit
9d2bcb56c7
7 измененных файлов с 38 добавлено и 10 удалено
  1. 4 0
      .travis.sh
  2. 3 0
      .travis.yml
  3. 10 0
      CMakeLists.txt
  4. 4 2
      code/B3DImporter.cpp
  5. 2 1
      code/FBXBinaryTokenizer.cpp
  6. 1 1
      code/IFCBoolean.cpp
  7. 14 6
      test/unit/utPretransformVertices.cpp

+ 4 - 0
.travis.sh

@@ -26,6 +26,10 @@ function generate()
         OPTIONS="$OPTIONS -DASSIMP_ASAN=OFF"
     fi
 
+    if [ "$UBSAN" = "ON" ] ; then
+        OPTIONS="$OPTIONS -DASSIMP_UBSAN=ON"
+    fi
+
     cmake -G "Unix Makefiles" $OPTIONS
 }
 

+ 3 - 0
.travis.yml

@@ -46,6 +46,9 @@ matrix:
     - os: linux
       compiler: clang
       env: ASAN=ON
+    - os: linux
+      compiler: clang
+      env: UBSAN=ON
     - os: linux
       compiler: clang
       env: SHARED_BUILD=ON

+ 10 - 0
CMakeLists.txt

@@ -86,6 +86,10 @@ OPTION ( ASSIMP_ASAN
   "Enable AddressSanitizer."
   OFF
 )
+OPTION ( ASSIMP_UBSAN
+  "Enable Undefined Behavior sanitizer."
+  OFF
+)
 OPTION ( SYSTEM_IRRXML
   "Use system installed Irrlicht/IrrXML library."
   OFF
@@ -234,6 +238,12 @@ if (ASSIMP_ASAN)
     SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address")
 endif()
 
+if (ASSIMP_UBSAN)
+    MESSAGE(STATUS "Undefined Behavior sanitizer enabled")
+    SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=undefined -fno-sanitize-recover=all")
+    SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=undefined -fno-sanitize-recover=all")
+endif()
+
 INCLUDE (FindPkgMacros)
 INCLUDE (PrecompiledHeader)
 

+ 4 - 2
code/B3DImporter.cpp

@@ -171,7 +171,8 @@ int B3DImporter::ReadByte(){
 // ------------------------------------------------------------------------------------------------
 int B3DImporter::ReadInt(){
     if( _pos+4<=_buf.size() ){
-        int n=*(int*)&_buf[_pos];
+        int n;
+        memcpy(&n, &_buf[_pos], 4);
         _pos+=4;
         return n;
     }
@@ -182,7 +183,8 @@ int B3DImporter::ReadInt(){
 // ------------------------------------------------------------------------------------------------
 float B3DImporter::ReadFloat(){
     if( _pos+4<=_buf.size() ){
-        float n=*(float*)&_buf[_pos];
+        float n;
+        memcpy(&n, &_buf[_pos], 4);
         _pos+=4;
         return n;
     }

+ 2 - 1
code/FBXBinaryTokenizer.cpp

@@ -151,7 +151,8 @@ uint32_t ReadWord(const char* input, const char*& cursor, const char* end)
         TokenizeError("cannot ReadWord, out of bounds",input, cursor);
     }
 
-    uint32_t word = *reinterpret_cast<const uint32_t*>(cursor);
+    uint32_t word;
+    memcpy(&word, cursor, 4);
     AI_SWAP4(word);
 
     cursor += k_to_read;

+ 1 - 1
code/IFCBoolean.cpp

@@ -272,7 +272,6 @@ bool IntersectsBoundaryProfile(const IfcVector3& e0, const IfcVector3& e1, const
         const IfcVector3& b0 = boundary[i];
         const IfcVector3& b1 = boundary[(i + 1) % bcount];
         IfcVector3 b = b1 - b0;
-        IfcFloat b_sqlen_inv = 1.0 / b.SquareLength();
 
         // segment-segment intersection
         // solve b0 + b*s = e0 + e*t for (s,t)
@@ -281,6 +280,7 @@ bool IntersectsBoundaryProfile(const IfcVector3& e0, const IfcVector3& e1, const
             // no solutions (parallel lines)
             continue;
         }
+        IfcFloat b_sqlen_inv = 1.0 / b.SquareLength();
 
         const IfcFloat x = b0.x - e0.x;
         const IfcFloat y = b0.y - e0.y;

+ 14 - 6
test/unit/utPretransformVertices.cpp

@@ -90,28 +90,36 @@ void PretransformVerticesTest::SetUp()
 
     // add 5 empty materials
     scene->mMaterials = new aiMaterial*[scene->mNumMaterials = 5];
-    for (unsigned int i = 0; i < 5;++i)
+    for (unsigned int i = 0; i < 5;++i) {
         scene->mMaterials[i] = new aiMaterial();
+    }
 
     // add 25 test meshes
     scene->mMeshes = new aiMesh*[scene->mNumMeshes = 25];
-    for (unsigned int i = 0; i < 25;++i) {
-        aiMesh* mesh = scene->mMeshes[i] = new aiMesh();
+    for ( unsigned int i = 0; i < 25; ++i) {
+        aiMesh* mesh = scene->mMeshes[ i ] = new aiMesh();
 
         mesh->mPrimitiveTypes = aiPrimitiveType_POINT;
         mesh->mFaces = new aiFace[ mesh->mNumFaces = 10+i ];
         mesh->mVertices = new aiVector3D[mesh->mNumVertices = mesh->mNumFaces];
         for (unsigned int a = 0; a < mesh->mNumFaces; ++a ) {
-            aiFace& f = mesh->mFaces[a];
-            f.mIndices = new unsigned int [f.mNumIndices = 1];
+            aiFace& f = mesh->mFaces[ a ];
+            f.mIndices = new unsigned int [ f.mNumIndices = 1 ];
             f.mIndices[0] = a*3;
 
             mesh->mVertices[a] = aiVector3D((float)i,(float)a,0.f);
         }
         mesh->mMaterialIndex = i%5;
 
-        if (i % 2)
+        if (i % 2) {
             mesh->mNormals = new aiVector3D[mesh->mNumVertices];
+            for ( unsigned int normalIdx=0; normalIdx<mesh->mNumVertices; ++normalIdx ) {
+                mesh->mNormals[ normalIdx ].x = 1.0f;
+                mesh->mNormals[ normalIdx ].y = 1.0f;
+                mesh->mNormals[ normalIdx ].z = 1.0f;
+                mesh->mNormals[ normalIdx ].Normalize();
+            }
+        }
     }
 
     // construct some nodes (1+25)