Coverage Report

Created: 2026-07-25 06:07

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