Coverage Report

Created: 2026-10-05 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.01k
void fuzzGeometry(FuzzedDataProvider* stream) {
23
1.01k
  typedef Eigen::Matrix<Scalar, 3, 1> Vector3;
24
1.01k
  typedef Eigen::Quaternion<Scalar> Quaternion;
25
1.01k
  typedef Eigen::AngleAxis<Scalar> AngleAxis;
26
1.01k
  typedef Eigen::Rotation2D<Scalar> Rotation2D;
27
1.01k
  typedef Eigen::Transform<Scalar, 3, Eigen::Affine> Transform3;
28
29
1.01k
  Vector3 v1(stream->ConsumeFloatingPoint<Scalar>(),
30
1.01k
             stream->ConsumeFloatingPoint<Scalar>(),
31
1.01k
             stream->ConsumeFloatingPoint<Scalar>());
32
1.01k
  Vector3 v2(stream->ConsumeFloatingPoint<Scalar>(),
33
1.01k
             stream->ConsumeFloatingPoint<Scalar>(),
34
1.01k
             stream->ConsumeFloatingPoint<Scalar>());
35
36
  // Quaternions
37
1.01k
  Quaternion q1(stream->ConsumeFloatingPoint<Scalar>(),
38
1.01k
                stream->ConsumeFloatingPoint<Scalar>(),
39
1.01k
                stream->ConsumeFloatingPoint<Scalar>(),
40
1.01k
                stream->ConsumeFloatingPoint<Scalar>());
41
1.01k
  q1.normalize();
42
1.01k
  Quaternion q2(stream->ConsumeFloatingPoint<Scalar>(),
43
1.01k
                stream->ConsumeFloatingPoint<Scalar>(),
44
1.01k
                stream->ConsumeFloatingPoint<Scalar>(),
45
1.01k
                stream->ConsumeFloatingPoint<Scalar>());
46
1.01k
  q2.normalize();
47
48
1.01k
  (void)q1.slerp(stream->ConsumeFloatingPoint<Scalar>(), q2);
49
1.01k
  (void)q1.inverse();
50
1.01k
  (void)q1.conjugate();
51
1.01k
  (void)(q1 * q2);
52
1.01k
  (void)(q1 * v1);
53
54
  // AngleAxis
55
1.01k
  AngleAxis aa1(stream->ConsumeFloatingPoint<Scalar>(), v1.normalized());
56
1.01k
  (void)aa1.toRotationMatrix();
57
1.01k
  (void)Quaternion(aa1);
58
59
  // Transform
60
1.01k
  Transform3 t1 = Transform3::Identity();
61
1.01k
  t1.translate(v1);
62
1.01k
  t1.rotate(q1);
63
1.01k
  t1.scale(stream->ConsumeFloatingPoint<Scalar>());
64
  
65
1.01k
  (void)(t1 * v2);
66
1.01k
  (void)t1.inverse();
67
68
  // Hyperplane
69
1.01k
  Eigen::Hyperplane<Scalar, 3> hp(v1.normalized(), stream->ConsumeFloatingPoint<Scalar>());
70
1.01k
  (void)hp.absDistance(v2);
71
1.01k
  (void)hp.projection(v2);
72
73
  // ParametrizedLine
74
1.01k
  Eigen::ParametrizedLine<Scalar, 3> line(v1, v2.normalized());
75
1.01k
  (void)line.distance(v2);
76
1.01k
  (void)line.projection(v2);
77
1.01k
}
geometry_fuzzer.cc:void (anonymous namespace)::fuzzGeometry<float>(FuzzedDataProvider*)
Line
Count
Source
22
511
void fuzzGeometry(FuzzedDataProvider* stream) {
23
511
  typedef Eigen::Matrix<Scalar, 3, 1> Vector3;
24
511
  typedef Eigen::Quaternion<Scalar> Quaternion;
25
511
  typedef Eigen::AngleAxis<Scalar> AngleAxis;
26
511
  typedef Eigen::Rotation2D<Scalar> Rotation2D;
27
511
  typedef Eigen::Transform<Scalar, 3, Eigen::Affine> Transform3;
28
29
511
  Vector3 v1(stream->ConsumeFloatingPoint<Scalar>(),
30
511
             stream->ConsumeFloatingPoint<Scalar>(),
31
511
             stream->ConsumeFloatingPoint<Scalar>());
32
511
  Vector3 v2(stream->ConsumeFloatingPoint<Scalar>(),
33
511
             stream->ConsumeFloatingPoint<Scalar>(),
34
511
             stream->ConsumeFloatingPoint<Scalar>());
35
36
  // Quaternions
37
511
  Quaternion q1(stream->ConsumeFloatingPoint<Scalar>(),
38
511
                stream->ConsumeFloatingPoint<Scalar>(),
39
511
                stream->ConsumeFloatingPoint<Scalar>(),
40
511
                stream->ConsumeFloatingPoint<Scalar>());
41
511
  q1.normalize();
42
511
  Quaternion q2(stream->ConsumeFloatingPoint<Scalar>(),
43
511
                stream->ConsumeFloatingPoint<Scalar>(),
44
511
                stream->ConsumeFloatingPoint<Scalar>(),
45
511
                stream->ConsumeFloatingPoint<Scalar>());
46
511
  q2.normalize();
47
48
511
  (void)q1.slerp(stream->ConsumeFloatingPoint<Scalar>(), q2);
49
511
  (void)q1.inverse();
50
511
  (void)q1.conjugate();
51
511
  (void)(q1 * q2);
52
511
  (void)(q1 * v1);
53
54
  // AngleAxis
55
511
  AngleAxis aa1(stream->ConsumeFloatingPoint<Scalar>(), v1.normalized());
56
511
  (void)aa1.toRotationMatrix();
57
511
  (void)Quaternion(aa1);
58
59
  // Transform
60
511
  Transform3 t1 = Transform3::Identity();
61
511
  t1.translate(v1);
62
511
  t1.rotate(q1);
63
511
  t1.scale(stream->ConsumeFloatingPoint<Scalar>());
64
  
65
511
  (void)(t1 * v2);
66
511
  (void)t1.inverse();
67
68
  // Hyperplane
69
511
  Eigen::Hyperplane<Scalar, 3> hp(v1.normalized(), stream->ConsumeFloatingPoint<Scalar>());
70
511
  (void)hp.absDistance(v2);
71
511
  (void)hp.projection(v2);
72
73
  // ParametrizedLine
74
511
  Eigen::ParametrizedLine<Scalar, 3> line(v1, v2.normalized());
75
511
  (void)line.distance(v2);
76
511
  (void)line.projection(v2);
77
511
}
geometry_fuzzer.cc:void (anonymous namespace)::fuzzGeometry<double>(FuzzedDataProvider*)
Line
Count
Source
22
500
void fuzzGeometry(FuzzedDataProvider* stream) {
23
500
  typedef Eigen::Matrix<Scalar, 3, 1> Vector3;
24
500
  typedef Eigen::Quaternion<Scalar> Quaternion;
25
500
  typedef Eigen::AngleAxis<Scalar> AngleAxis;
26
500
  typedef Eigen::Rotation2D<Scalar> Rotation2D;
27
500
  typedef Eigen::Transform<Scalar, 3, Eigen::Affine> Transform3;
28
29
500
  Vector3 v1(stream->ConsumeFloatingPoint<Scalar>(),
30
500
             stream->ConsumeFloatingPoint<Scalar>(),
31
500
             stream->ConsumeFloatingPoint<Scalar>());
32
500
  Vector3 v2(stream->ConsumeFloatingPoint<Scalar>(),
33
500
             stream->ConsumeFloatingPoint<Scalar>(),
34
500
             stream->ConsumeFloatingPoint<Scalar>());
35
36
  // Quaternions
37
500
  Quaternion q1(stream->ConsumeFloatingPoint<Scalar>(),
38
500
                stream->ConsumeFloatingPoint<Scalar>(),
39
500
                stream->ConsumeFloatingPoint<Scalar>(),
40
500
                stream->ConsumeFloatingPoint<Scalar>());
41
500
  q1.normalize();
42
500
  Quaternion q2(stream->ConsumeFloatingPoint<Scalar>(),
43
500
                stream->ConsumeFloatingPoint<Scalar>(),
44
500
                stream->ConsumeFloatingPoint<Scalar>(),
45
500
                stream->ConsumeFloatingPoint<Scalar>());
46
500
  q2.normalize();
47
48
500
  (void)q1.slerp(stream->ConsumeFloatingPoint<Scalar>(), q2);
49
500
  (void)q1.inverse();
50
500
  (void)q1.conjugate();
51
500
  (void)(q1 * q2);
52
500
  (void)(q1 * v1);
53
54
  // AngleAxis
55
500
  AngleAxis aa1(stream->ConsumeFloatingPoint<Scalar>(), v1.normalized());
56
500
  (void)aa1.toRotationMatrix();
57
500
  (void)Quaternion(aa1);
58
59
  // Transform
60
500
  Transform3 t1 = Transform3::Identity();
61
500
  t1.translate(v1);
62
500
  t1.rotate(q1);
63
500
  t1.scale(stream->ConsumeFloatingPoint<Scalar>());
64
  
65
500
  (void)(t1 * v2);
66
500
  (void)t1.inverse();
67
68
  // Hyperplane
69
500
  Eigen::Hyperplane<Scalar, 3> hp(v1.normalized(), stream->ConsumeFloatingPoint<Scalar>());
70
500
  (void)hp.absDistance(v2);
71
500
  (void)hp.projection(v2);
72
73
  // ParametrizedLine
74
500
  Eigen::ParametrizedLine<Scalar, 3> line(v1, v2.normalized());
75
500
  (void)line.distance(v2);
76
500
  (void)line.projection(v2);
77
500
}
78
79
} // namespace
80
81
1.01k
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
82
1.01k
  FuzzedDataProvider stream(data, size);
83
84
1.01k
  uint8_t type = stream.ConsumeIntegral<uint8_t>();
85
1.01k
  if (type % 2 == 0) {
86
511
    fuzzGeometry<float>(&stream);
87
511
  } else {
88
500
    fuzzGeometry<double>(&stream);
89
500
  }
90
91
1.01k
  return 0;
92
1.01k
}