fixed some more memory alignment etc issues
These are issues found with -fsanitize=undefined.
diff --git a/aos/common/common.gyp b/aos/common/common.gyp
index d3ac124..c989bf2 100644
--- a/aos/common/common.gyp
+++ b/aos/common/common.gyp
@@ -108,6 +108,7 @@
'queue_types',
'<(EXTERNALS):gtest',
'test_queue',
+ '<(AOS)/build/aos.gyp:logging',
],
},
{
@@ -275,6 +276,7 @@
'<(EXTERNALS):gtest',
'mutex',
'die',
+ '<(AOS)/build/aos.gyp:logging',
],
},
{
diff --git a/bbb_cape/src/bbb/packet_finder.cc b/bbb_cape/src/bbb/packet_finder.cc
index 43363b8..4ddb0e3 100644
--- a/bbb_cape/src/bbb/packet_finder.cc
+++ b/bbb_cape/src/bbb/packet_finder.cc
@@ -85,7 +85,7 @@
if (packet_bytes_ == -1) {
for (size_t to_check = already_read; to_check < already_read + new_bytes;
++to_check) {
- if (buf_[to_check] == 0) {
+ if (buf(to_check) == 0) {
++zeros_found;
if (zeros_found == kZeros) {
packet_bytes_ = 0;
@@ -149,7 +149,7 @@
packet_bytes_ = -1;
int zeros = 0;
for (size_t i = 0; i < packet_size_; ++i) {
- if (buf_[i] == 0) {
+ if (buf(i) == 0) {
++zeros;
if (zeros == kZeros) {
if (kDebugLogs) LOG(INFO, "start at %zd\n", i);
diff --git a/bbb_cape/src/bbb/packet_finder.h b/bbb_cape/src/bbb/packet_finder.h
index 9aa0eeb..e8816b1 100644
--- a/bbb_cape/src/bbb/packet_finder.h
+++ b/bbb_cape/src/bbb/packet_finder.h
@@ -54,6 +54,14 @@
// data.
bool ProcessPacket();
+ // Avoids issues with accessing elements of buf_ that are technically not
+ // aligned correctly.
+ uint8_t buf(size_t index) const {
+ uint8_t r;
+ memcpy(&r, &buf_[index], 1);
+ return r;
+ }
+
ByteReaderInterface *const reader_;
const size_t packet_size_;
diff --git a/bbb_cape/src/bbb/packet_finder_test.cc b/bbb_cape/src/bbb/packet_finder_test.cc
index b4937b1..53d9bbb 100644
--- a/bbb_cape/src/bbb/packet_finder_test.cc
+++ b/bbb_cape/src/bbb/packet_finder_test.cc
@@ -1,5 +1,7 @@
#include "bbb/packet_finder.h"
+#include <malloc.h>
+
#include <array>
#include <algorithm>
@@ -15,10 +17,17 @@
class TestByteReader : public ByteReaderInterface {
public:
- // Holds a reference to data's element array.
template <size_t bytes>
TestByteReader(const ::std::array<uint8_t, bytes> &data)
- : data_(&data.at(0)), data_size_(data.size()), bytes_left_(data.size()) {}
+ : data_(memalign(8, data.size())),
+ data_size_(data.size()),
+ bytes_left_(data.size()) {
+ memcpy(data_, &data.at(0), data.size());
+ }
+
+ ~TestByteReader() {
+ free(data_);
+ }
virtual ssize_t ReadBytes(uint8_t *dest, size_t max_bytes,
const ::aos::time::Time &/*timeout_time*/)
@@ -32,7 +41,7 @@
}
private:
- const void *const data_;
+ void *const data_;
const size_t data_size_;
size_t bytes_left_;
};
diff --git a/frc971/control_loops/drivetrain/drivetrain.cc b/frc971/control_loops/drivetrain/drivetrain.cc
index 77d5781..c815b8d 100644
--- a/frc971/control_loops/drivetrain/drivetrain.cc
+++ b/frc971/control_loops/drivetrain/drivetrain.cc
@@ -125,7 +125,7 @@
const ::aos::controls::HPolytope<2> U_Poly_;
Eigen::Matrix<double, 2, 2> T, T_inverse;
- bool output_was_capped_;
+ bool output_was_capped_ = false;;
};
DrivetrainMotorsSS()