Coverage Report

Created: 2026-09-14 07:13

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/geometry_fuzzer.cc
Line
Count
Source
1
// Copyright 2026 Google LLC
2
//
3
// Licensed under the Apache License, Version 2.0 (the "License");
4
// you may not use this file except in compliance with the License.
5
// You may obtain a copy of the License at
6
//
7
//      http://www.apache.org/licenses/LICENSE-2.0
8
//
9
// Unless required by applicable law or agreed to in writing, software
10
// distributed under the License is distributed on an "AS IS" BASIS,
11
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
// See the License for the specific language governing permissions and
13
// limitations under the License.
14
15
#include <fuzzer/FuzzedDataProvider.h>
16
#include <Eigen/Core>
17
#include <Eigen/Geometry>
18
19
namespace {
20
21
template <typename Scalar>
22
1.00k
void fuzzGeometry(FuzzedDataProvider* stream) {
23
1.00k
  typedef Eigen::Matrix<Scalar, 3, 1> Vector3;
24
1.00k
  typedef Eigen::Quaternion<Scalar> Quaternion;
25
1.00k
  typedef Eigen::AngleAxis<Scalar> AngleAxis;
26
1.00k
  typedef Eigen::Rotation2D<Scalar> Rotation2D;
27
1.00k
  typedef Eigen::Transform<Scalar, 3, Eigen::Affine> Transform3;
28
29
1.00k
  Vector3 v1(stream->ConsumeFloatingPoint<Scalar>(),
30
1.00k
             stream->ConsumeFloatingPoint<Scalar>(),
31
1.00k
             stream->ConsumeFloatingPoint<Scalar>());
32
1.00k
  Vector3 v2(stream->ConsumeFloatingPoint<Scalar>(),
33
1.00k
             stream->ConsumeFloatingPoint<Scalar>(),
34
1.00k
             stream->ConsumeFloatingPoint<Scalar>());
35
36
  // Quaternions
37
1.00k
  Quaternion q1(stream->ConsumeFloatingPoint<Scalar>(),
38
1.00k
                stream->ConsumeFloatingPoint<Scalar>(),
39
1.00k
                stream->ConsumeFloatingPoint<Scalar>(),
40
1.00k
                stream->ConsumeFloatingPoint<Scalar>());
41
1.00k
  q1.normalize();
42
1.00k
  Quaternion q2(stream->ConsumeFloatingPoint<Scalar>(),
43
1.00k
                stream->ConsumeFloatingPoint<Scalar>(),
44
1.00k
                stream->ConsumeFloatingPoint<Scalar>(),
45
1.00k
                stream->ConsumeFloatingPoint<Scalar>());
46
1.00k
  q2.normalize();
47
48
1.00k
  (void)q1.slerp(stream->ConsumeFloatingPoint<Scalar>(), q2);
49
1.00k
  (void)q1.inverse();
50
1.00k
  (void)q1.conjugate();
51
1.00k
  (void)(q1 * q2);
52
1.00k
  (void)(q1 * v1);
53
54
  // AngleAxis
55
1.00k
  AngleAxis aa1(stream->ConsumeFloatingPoint<Scalar>(), v1.normalized());
56
1.00k
  (void)aa1.toRotationMatrix();
57
1.00k
  (void)Quaternion(aa1);
58
59
  // Transform
60
1.00k
  Transform3 t1 = Transform3::Identity();
61
1.00k
  t1.translate(v1);
62
1.00k
  t1.rotate(q1);
63
1.00k
  t1.scale(stream->ConsumeFloatingPoint<Scalar>());
64
  
65
1.00k
  (void)(t1 * v2);
66
1.00k
  (void)t1.inverse();
67
68
  // Hyperplane
69
1.00k
  Eigen::Hyperplane<Scalar, 3> hp(v1.normalized(), stream->ConsumeFloatingPoint<Scalar>());
70
1.00k
  (void)hp.absDistance(v2);
71
1.00k
  (void)hp.projection(v2);
72
73
  // ParametrizedLine
74
1.00k
  Eigen::ParametrizedLine<Scalar, 3> line(v1, v2.normalized());
75
1.00k
  (void)line.distance(v2);
76
1.00k
  (void)line.projection(v2);
77
1.00k
}
geometry_fuzzer.cc:void (anonymous namespace)::fuzzGeometry<float>(FuzzedDataProvider*)
Line
Count
Source
22
510
void fuzzGeometry(FuzzedDataProvider* stream) {
23
510
  typedef Eigen::Matrix<Scalar, 3, 1> Vector3;
24
510
  typedef Eigen::Quaternion<Scalar> Quaternion;
25
510
  typedef Eigen::AngleAxis<Scalar> AngleAxis;
26
510
  typedef Eigen::Rotation2D<Scalar> Rotation2D;
27
510
  typedef Eigen::Transform<Scalar, 3, Eigen::Affine> Transform3;
28
29
510
  Vector3 v1(stream->ConsumeFloatingPoint<Scalar>(),
30
510
             stream->ConsumeFloatingPoint<Scalar>(),
31
510
             stream->ConsumeFloatingPoint<Scalar>());
32
510
  Vector3 v2(stream->ConsumeFloatingPoint<Scalar>(),
33
510
             stream->ConsumeFloatingPoint<Scalar>(),
34
510
             stream->ConsumeFloatingPoint<Scalar>());
35
36
  // Quaternions
37
510
  Quaternion q1(stream->ConsumeFloatingPoint<Scalar>(),
38
510
                stream->ConsumeFloatingPoint<Scalar>(),
39
510
                stream->ConsumeFloatingPoint<Scalar>(),
40
510
                stream->ConsumeFloatingPoint<Scalar>());
41
510
  q1.normalize();
42
510
  Quaternion q2(stream->ConsumeFloatingPoint<Scalar>(),
43
510
                stream->ConsumeFloatingPoint<Scalar>(),
44
510
                stream->ConsumeFloatingPoint<Scalar>(),
45
510
                stream->ConsumeFloatingPoint<Scalar>());
46
510
  q2.normalize();
47
48
510
  (void)q1.slerp(stream->ConsumeFloatingPoint<Scalar>(), q2);
49
510
  (void)q1.inverse();
50
510
  (void)q1.conjugate();
51
510
  (void)(q1 * q2);
52
510
  (void)(q1 * v1);
53
54
  // AngleAxis
55
510
  AngleAxis aa1(stream->ConsumeFloatingPoint<Scalar>(), v1.normalized());
56
510
  (void)aa1.toRotationMatrix();
57
510
  (void)Quaternion(aa1);
58
59
  // Transform
60
510
  Transform3 t1 = Transform3::Identity();
61
510
  t1.translate(v1);
62
510
  t1.rotate(q1);
63
510
  t1.scale(stream->ConsumeFloatingPoint<Scalar>());
64
  
65
510
  (void)(t1 * v2);
66
510
  (void)t1.inverse();
67
68
  // Hyperplane
69
510
  Eigen::Hyperplane<Scalar, 3> hp(v1.normalized(), stream->ConsumeFloatingPoint<Scalar>());
70
510
  (void)hp.absDistance(v2);
71
510
  (void)hp.projection(v2);
72
73
  // ParametrizedLine
74
510
  Eigen::ParametrizedLine<Scalar, 3> line(v1, v2.normalized());
75
510
  (void)line.distance(v2);
76
510
  (void)line.projection(v2);
77
510
}
geometry_fuzzer.cc:void (anonymous namespace)::fuzzGeometry<double>(FuzzedDataProvider*)
Line
Count
Source
22
497
void fuzzGeometry(FuzzedDataProvider* stream) {
23
497
  typedef Eigen::Matrix<Scalar, 3, 1> Vector3;
24
497
  typedef Eigen::Quaternion<Scalar> Quaternion;
25
497
  typedef Eigen::AngleAxis<Scalar> AngleAxis;
26
497
  typedef Eigen::Rotation2D<Scalar> Rotation2D;
27
497
  typedef Eigen::Transform<Scalar, 3, Eigen::Affine> Transform3;
28
29
497
  Vector3 v1(stream->ConsumeFloatingPoint<Scalar>(),
30
497
             stream->ConsumeFloatingPoint<Scalar>(),
31
497
             stream->ConsumeFloatingPoint<Scalar>());
32
497
  Vector3 v2(stream->ConsumeFloatingPoint<Scalar>(),
33
497
             stream->ConsumeFloatingPoint<Scalar>(),
34
497
             stream->ConsumeFloatingPoint<Scalar>());
35
36
  // Quaternions
37
497
  Quaternion q1(stream->ConsumeFloatingPoint<Scalar>(),
38
497
                stream->ConsumeFloatingPoint<Scalar>(),
39
497
                stream->ConsumeFloatingPoint<Scalar>(),
40
497
                stream->ConsumeFloatingPoint<Scalar>());
41
497
  q1.normalize();
42
497
  Quaternion q2(stream->ConsumeFloatingPoint<Scalar>(),
43
497
                stream->ConsumeFloatingPoint<Scalar>(),
44
497
                stream->ConsumeFloatingPoint<Scalar>(),
45
497
                stream->ConsumeFloatingPoint<Scalar>());
46
497
  q2.normalize();
47
48
497
  (void)q1.slerp(stream->ConsumeFloatingPoint<Scalar>(), q2);
49
497
  (void)q1.inverse();
50
497
  (void)q1.conjugate();
51
497
  (void)(q1 * q2);
52
497
  (void)(q1 * v1);
53
54
  // AngleAxis
55
497
  AngleAxis aa1(stream->ConsumeFloatingPoint<Scalar>(), v1.normalized());
56
497
  (void)aa1.toRotationMatrix();
57
497
  (void)Quaternion(aa1);
58
59
  // Transform
60
497
  Transform3 t1 = Transform3::Identity();
61
497
  t1.translate(v1);
62
497
  t1.rotate(q1);
63
497
  t1.scale(stream->ConsumeFloatingPoint<Scalar>());
64
  
65
497
  (void)(t1 * v2);
66
497
  (void)t1.inverse();
67
68
  // Hyperplane
69
497
  Eigen::Hyperplane<Scalar, 3> hp(v1.normalized(), stream->ConsumeFloatingPoint<Scalar>());
70
497
  (void)hp.absDistance(v2);
71
497
  (void)hp.projection(v2);
72
73
  // ParametrizedLine
74
497
  Eigen::ParametrizedLine<Scalar, 3> line(v1, v2.normalized());
75
497
  (void)line.distance(v2);
76
497
  (void)line.projection(v2);
77
497
}
78
79
} // namespace
80
81
1.00k
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
82
1.00k
  FuzzedDataProvider stream(data, size);
83
84
1.00k
  uint8_t type = stream.ConsumeIntegral<uint8_t>();
85
1.00k
  if (type % 2 == 0) {
86
510
    fuzzGeometry<float>(&stream);
87
510
  } else {
88
497
    fuzzGeometry<double>(&stream);
89
497
  }
90
91
1.00k
  return 0;
92
1.00k
}