QGroundControl
Ground Control Station for MAVLink Drones
Loading...
Searching...
No Matches
SecureMemory.h
Go to the documentation of this file.
1#pragma once
2
3#include <QtCore/QByteArray>
4#include <array>
5#include <cstddef>
6#include <cstring>
7
8#if defined(_WIN32)
9#include <windows.h>
10#elif (defined(__linux__) && !defined(__ANDROID__)) || defined(__FreeBSD__)
11#include <strings.h> // explicit_bzero (Bionic exposes it only via <string.h>, gated on API; use fallback)
12#endif
13
14namespace QGC {
15
19inline void secureZero(void* data, size_t size)
20{
21 if (data == nullptr || size == 0) {
22 return;
23 }
24#if defined(_WIN32)
25 SecureZeroMemory(data, size);
26#elif (defined(__linux__) && !defined(__ANDROID__)) || defined(__FreeBSD__)
27 explicit_bzero(data, size);
28#else
29 volatile unsigned char* p = static_cast<volatile unsigned char*>(data);
30 for (size_t i = 0; i < size; ++i) {
31 p[i] = 0;
32 }
33 // Memory barrier prevents the optimizer from coalescing writes with later allocator reuse.
34 asm volatile("" ::: "memory");
35#endif
36}
37
40inline void secureZero(QByteArray& data)
41{
42 if (!data.isEmpty()) {
43 secureZero(data.data(), static_cast<size_t>(data.size()));
44 }
45 data.clear();
46}
47
48template <typename T, size_t N>
49inline void secureZero(std::array<T, N>& arr)
50{
51 secureZero(arr.data(), arr.size() * sizeof(T));
52}
53
54} // namespace QGC
void secureZero(void *data, size_t size)