Currently the nan* functions use nullptr dereferencing to crash with SIGSEGV if the input is nullptr. Both `nan(nullptr)` and `nullptr` dereferencing are undefined behaviors according to the C standard. Employing `nullptr` dereference in the `nan` function implementation is ok if users only linked against the pre-built library, but it might be completely removed by the compilers' optimizations if it is built from source together with the users' code. See for instance: https://godbolt.org/z/fd8KcM9bx This PR uses volatile load to prevent the undefined behavior if libc is built without sanitizers, and leave the current undefined behavior if libc is built with sanitizers, so that the undefined behavior can be caught for users' codes.
105 lines
4.0 KiB
JSON
105 lines
4.0 KiB
JSON
{
|
|
"errno": {
|
|
"LIBC_CONF_ERRNO_MODE": {
|
|
"value": "LIBC_ERRNO_MODE_DEFAULT",
|
|
"doc": "The implementation used for errno, acceptable values are LIBC_ERRNO_MODE_DEFAULT, LIBC_ERRNO_MODE_UNDEFINED, LIBC_ERRNO_MODE_THREAD_LOCAL, LIBC_ERRNO_MODE_SHARED, LIBC_ERRNO_MODE_EXTERNAL, and LIBC_ERRNO_MODE_SYSTEM."
|
|
}
|
|
},
|
|
"printf": {
|
|
"LIBC_CONF_PRINTF_DISABLE_FLOAT": {
|
|
"value": false,
|
|
"doc": "Disable printing floating point values in printf and friends."
|
|
},
|
|
"LIBC_CONF_PRINTF_DISABLE_INDEX_MODE": {
|
|
"value": false,
|
|
"doc": "Disable index mode in the printf format string."
|
|
},
|
|
"LIBC_CONF_PRINTF_DISABLE_WRITE_INT": {
|
|
"value": false,
|
|
"doc": "Disable handling of %n in printf format string."
|
|
},
|
|
"LIBC_CONF_PRINTF_FLOAT_TO_STR_USE_MEGA_LONG_DOUBLE_TABLE": {
|
|
"value": false,
|
|
"doc": "Use large table for better printf long double performance."
|
|
},
|
|
"LIBC_CONF_PRINTF_DISABLE_FIXED_POINT": {
|
|
"value": false,
|
|
"doc": "Disable printing fixed point values in printf and friends."
|
|
}
|
|
},
|
|
"scanf": {
|
|
"LIBC_CONF_SCANF_DISABLE_FLOAT": {
|
|
"value": false,
|
|
"doc": "Disable parsing floating point values in scanf and friends."
|
|
},
|
|
"LIBC_CONF_SCANF_DISABLE_INDEX_MODE": {
|
|
"value": false,
|
|
"doc": "Disable index mode in the scanf format string."
|
|
}
|
|
},
|
|
"string": {
|
|
"LIBC_CONF_STRING_UNSAFE_WIDE_READ": {
|
|
"value": false,
|
|
"doc": "Read more than a byte at a time to perform byte-string operations like strlen."
|
|
},
|
|
"LIBC_CONF_MEMSET_X86_USE_SOFTWARE_PREFETCHING": {
|
|
"value": false,
|
|
"doc": "Inserts prefetch for write instructions (PREFETCHW) for memset on x86 to recover performance when hardware prefetcher is disabled."
|
|
}
|
|
},
|
|
"codegen": {
|
|
"LIBC_CONF_KEEP_FRAME_POINTER": {
|
|
"value": true,
|
|
"doc": "Keep frame pointer in functions for better debugging experience."
|
|
},
|
|
"LIBC_CONF_ENABLE_STRONG_STACK_PROTECTOR": {
|
|
"value": true,
|
|
"doc": "Enable -fstack-protector-strong to defend against stack smashing attack."
|
|
}
|
|
},
|
|
"pthread": {
|
|
"LIBC_CONF_TIMEOUT_ENSURE_MONOTONICITY": {
|
|
"value": true,
|
|
"doc": "Automatically adjust timeout to CLOCK_MONOTONIC (default to true). POSIX API may require CLOCK_REALTIME, which can be unstable and leading to unexpected behavior. This option will convert the real-time timestamp to monotonic timestamp relative to the time of call."
|
|
},
|
|
"LIBC_CONF_RAW_MUTEX_DEFAULT_SPIN_COUNT": {
|
|
"value": 100,
|
|
"doc": "Default number of spins before blocking if a mutex is in contention (default to 100)."
|
|
},
|
|
"LIBC_CONF_RWLOCK_DEFAULT_SPIN_COUNT": {
|
|
"value": 100,
|
|
"doc": "Default number of spins before blocking if a rwlock is in contention (default to 100)."
|
|
}
|
|
},
|
|
"math": {
|
|
"LIBC_CONF_MATH_OPTIMIZATIONS": {
|
|
"value": 0,
|
|
"doc": "Configures optimizations for math functions. Values accepted are LIBC_MATH_SKIP_ACCURATE_PASS, LIBC_MATH_SMALL_TABLES, LIBC_MATH_NO_ERRNO, LIBC_MATH_NO_EXCEPT, and LIBC_MATH_FAST."
|
|
}
|
|
},
|
|
"qsort": {
|
|
"LIBC_CONF_QSORT_IMPL": {
|
|
"value": "LIBC_QSORT_QUICK_SORT",
|
|
"doc": "Configures sorting algorithm for qsort and qsort_r. Values accepted are LIBC_QSORT_QUICK_SORT, LIBC_QSORT_HEAP_SORT."
|
|
}
|
|
},
|
|
"setjmp": {
|
|
"LIBC_CONF_SETJMP_AARCH64_RESTORE_PLATFORM_REGISTER": {
|
|
"value": true,
|
|
"doc": "Make setjmp save the value of x18, and longjmp restore it. The AArch64 ABI delegates this register to platform ABIs, which can choose whether to make it caller-saved."
|
|
}
|
|
},
|
|
"time": {
|
|
"LIBC_CONF_TIME_64BIT": {
|
|
"value": false,
|
|
"doc": "Force the size of time_t to 64 bits, even on platforms where compatibility considerations would otherwise make it 32-bit."
|
|
}
|
|
},
|
|
"general": {
|
|
"LIBC_ADD_NULL_CHECKS": {
|
|
"value": true,
|
|
"doc": "Add nullptr checks in the library's implementations to some functions for which passing nullptr is undefined behavior."
|
|
}
|
|
}
|
|
}
|