mirror of
https://github.com/open-source-parsers/jsoncpp.git
synced 2024-12-27 11:21:02 +08:00
42e892d96e
On CHERI, and thus Arm's Morello prototype, pointers are represented as hardware capabilities. These capabilities are comprised of not just an integer address, as is the representation for traditional pointers, but also bounds, permissions and other metadata, plus a tag bit used as the validity bit, which provides fine-grained spatial and referential safety for C and C++ in hardware. This tag bit is not part of the data itself and is instead kept on the side, flowing with the capability between registers and the memory subsystem, and any attempt to amplify the privilege of or corrupt a capability clears this tag (or, in some cases, traps), rendering them impossible to forge; you can only create capabilities that are (possibly trivial) subsets of existing ones. When the capability is stored in memory, this tag bit needs to be preserved, which is done through the use of tagged memory. Every capability-sized word gains an additional non-addressable (from the CPU's perspective; depending on the implementation the tag bits may be stored in a small block of memory carved out of normal DRAM that the CPU is blocked from accessing) bit. This means that capabilities can only be stored to aligned locations; attempting to store them to unaligned locations will trap with an alignment fault or, if you end up using a memcpy call, will copy the raw bytes of the capability's representation but lose the tag, so when it is eventually loaded back as a capability and dereferenced it will fault. Since, on 64-bit architectures, our capabilities, used to implement C language pointers, are 128-bit quantities, this means they need 16-byte alignment. Currently the various #pragma pack directives, used to work around (extremely broken and bogus) code that includes jsoncpp in a context where the maximum alignment has been overridden, hard-code 8 as the maximum alignment to use, and so do not sufficiently align CHERI / Morello capabilities on 64-bit architectures. On Windows x64, the default is also not 8 but 16 (ARM64 is supposedly 8), so this is slightly dodgy to do there too, but in practice likely not an issue so long as you don't use any 128-bit types there. Instead of hard-coding a width, use a directive that resets the packing back to the default. Unfortunately, whilst GCC and Clang both accept using #pragma pack(push, 0) as shorthand like for any non-zero value, MSVC does not, so this needs to be two directives.
63 lines
1.8 KiB
C++
63 lines
1.8 KiB
C++
// Copyright 2007-2010 Baptiste Lepilleur and The JsonCpp Authors
|
|
// Distributed under MIT license, or public domain if desired and
|
|
// recognized in your jurisdiction.
|
|
// See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE
|
|
|
|
#ifndef JSON_FEATURES_H_INCLUDED
|
|
#define JSON_FEATURES_H_INCLUDED
|
|
|
|
#if !defined(JSON_IS_AMALGAMATION)
|
|
#include "forwards.h"
|
|
#endif // if !defined(JSON_IS_AMALGAMATION)
|
|
|
|
#pragma pack(push)
|
|
#pragma pack()
|
|
|
|
namespace Json {
|
|
|
|
/** \brief Configuration passed to reader and writer.
|
|
* This configuration object can be used to force the Reader or Writer
|
|
* to behave in a standard conforming way.
|
|
*/
|
|
class JSON_API Features {
|
|
public:
|
|
/** \brief A configuration that allows all features and assumes all strings
|
|
* are UTF-8.
|
|
* - C & C++ comments are allowed
|
|
* - Root object can be any JSON value
|
|
* - Assumes Value strings are encoded in UTF-8
|
|
*/
|
|
static Features all();
|
|
|
|
/** \brief A configuration that is strictly compatible with the JSON
|
|
* specification.
|
|
* - Comments are forbidden.
|
|
* - Root object must be either an array or an object value.
|
|
* - Assumes Value strings are encoded in UTF-8
|
|
*/
|
|
static Features strictMode();
|
|
|
|
/** \brief Initialize the configuration like JsonConfig::allFeatures;
|
|
*/
|
|
Features();
|
|
|
|
/// \c true if comments are allowed. Default: \c true.
|
|
bool allowComments_{true};
|
|
|
|
/// \c true if root must be either an array or an object value. Default: \c
|
|
/// false.
|
|
bool strictRoot_{false};
|
|
|
|
/// \c true if dropped null placeholders are allowed. Default: \c false.
|
|
bool allowDroppedNullPlaceholders_{false};
|
|
|
|
/// \c true if numeric object key are allowed. Default: \c false.
|
|
bool allowNumericKeys_{false};
|
|
};
|
|
|
|
} // namespace Json
|
|
|
|
#pragma pack(pop)
|
|
|
|
#endif // JSON_FEATURES_H_INCLUDED
|