aboutsummaryrefslogtreecommitdiffstats
path: root/include/gsl/gsl_util
diff options
context:
space:
mode:
authorAnna Gringauze <annagrin@microsoft.com>2018-08-12 21:44:17 -0700
committerNeil MacIntosh <neilmac@fb.com>2018-08-12 21:44:17 -0700
commitcea0d0ac2bd775f0fb4c7e357a089979370ae3cd (patch)
treefaa0e678f606971b55ef795d507d613d40e93de2 /include/gsl/gsl_util
parent6a75903c79ff7109c24d281372005b622a9d9177 (diff)
downloadplatform_external_Microsoft-GSL-cea0d0ac2bd775f0fb4c7e357a089979370ae3cd.tar.gz
platform_external_Microsoft-GSL-cea0d0ac2bd775f0fb4c7e357a089979370ae3cd.tar.bz2
platform_external_Microsoft-GSL-cea0d0ac2bd775f0fb4c7e357a089979370ae3cd.zip
fix cppcorecheck warnings (#703)
* Added c++17 test configurations for clang5.0 and clang6.0 * Fixed CppCoreCheck warnings in GSL and tests - Added CMakeSettings.json for VS Open Folder configuration - So we can easily run CppCoreCheck in VS - Fixed CppCorecheck warnings where it made sense - Suppressed the rest - Some suppression does not work due to compiler/tool bugs, so replaced by #pragma disable - CppCoreCheck has noise, suppressed those with comments - Catch produces many warnings, blanket-supressed them all - Had to fix clang formatting to keep attributes in place - clang-format does not support attributes, so I am using - "CommentPragmas: '^ NO-FORMAT:'" to skip formatiting on them - Removed GSL_NOEXCEPT macro, removed incorred noexcepts * Ignore unknown attributes * ignore unknown attributes in noexception mode tests * fixed C26472 in at() * created GSL_SUPPRESS macro to allow all compilers to parse suppression attributes * try to fix gcc compilation problems with attributes * ignore gsl::suppress for gcc * move suppression to function level on return statements clang5.0 and up does not allow attributes on return statemets in constexpr functions * move suppression to function level on return statements * use GSL_SUPPRESS in algorithm_tests * Addressed PR comments
Diffstat (limited to 'include/gsl/gsl_util')
-rw-r--r--include/gsl/gsl_util40
1 files changed, 16 insertions, 24 deletions
diff --git a/include/gsl/gsl_util b/include/gsl/gsl_util
index ee61711..542bbaa 100644
--- a/include/gsl/gsl_util
+++ b/include/gsl/gsl_util
@@ -34,8 +34,8 @@
#if _MSC_VER < 1910
#pragma push_macro("constexpr")
#define constexpr /*constexpr*/
-#endif // _MSC_VER < 1910
-#endif // _MSC_VER
+#endif // _MSC_VER < 1910
+#endif // _MSC_VER
namespace gsl
{
@@ -62,6 +62,7 @@ public:
final_action& operator=(const final_action&) = delete;
final_action& operator=(final_action&&) = delete;
+ GSL_SUPPRESS(f.6) // NO-FORMAT: attribute // terminate if throws
~final_action() noexcept
{
if (invoke_) f_();
@@ -69,12 +70,11 @@ public:
private:
F f_;
- bool invoke_ {true};
+ bool invoke_{true};
};
// finally() - convenience function to generate a final_action
template <class F>
-
final_action<F> finally(const F& f) noexcept
{
return final_action<F>(f);
@@ -88,10 +88,7 @@ final_action<F> finally(F&& f) noexcept
// narrow_cast(): a searchable way to do narrowing casts of values
template <class T, class U>
-#if defined(__clang__) || defined(__GNUC__)
-#else
-[[gsl::suppress(type.1)]]
-#endif
+GSL_SUPPRESS(type.1) // NO-FORMAT: attribute
constexpr T narrow_cast(U&& u) noexcept
{
return static_cast<T>(std::forward<U>(u));
@@ -108,15 +105,13 @@ namespace details
: public std::integral_constant<bool, std::is_signed<T>::value == std::is_signed<U>::value>
{
};
-}
+} // namespace details
// narrow() : a checked version of narrow_cast() that throws if the cast changed the value
template <class T, class U>
-#if defined(__clang__) || defined(__GNUC__)
-#else
-[[gsl::suppress(type.1)]]
-#endif
-T narrow(U u)
+GSL_SUPPRESS(type.1) // NO-FORMAT: attribute
+GSL_SUPPRESS(f.6) // NO-FORMAT: attribute // TODO: MSVC /analyze does not recognise noexcept(false)
+T narrow(U u) noexcept(false)
{
T t = narrow_cast<T>(u);
if (static_cast<U>(t) != u) gsl::details::throw_exception(narrowing_error());
@@ -129,29 +124,26 @@ T narrow(U u)
// at() - Bounds-checked way of accessing builtin arrays, std::array, std::vector
//
template <class T, std::size_t N>
-#if defined(__clang__) || defined(__GNUC__)
-#else
-[[gsl::suppress(type.1,bounds.2,bounds.4)]]
-#endif
+GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute
+GSL_SUPPRESS(bounds.2) // NO-FORMAT: attribute
constexpr T& at(T (&arr)[N], const index i)
{
Expects(i >= 0 && i < narrow_cast<index>(N));
- return arr[static_cast<std::size_t>(i)];
+ return arr[narrow_cast<std::size_t>(i)];
}
template <class Cont>
-#if defined(__clang__) || defined(__GNUC__)
-#else
-[[gsl::suppress(type.1,bounds.4)]]
-#endif
+GSL_SUPPRESS(bounds.4) // NO-FORMAT: attribute
+GSL_SUPPRESS(bounds.2) // NO-FORMAT: attribute
constexpr auto at(Cont& cont, const index i) -> decltype(cont[cont.size()])
{
Expects(i >= 0 && i < narrow_cast<index>(cont.size()));
using size_type = decltype(cont.size());
- return cont[static_cast<size_type>(i)];
+ return cont[narrow_cast<size_type>(i)];
}
template <class T>
+GSL_SUPPRESS(bounds.1) // NO-FORMAT: attribute
constexpr T at(const std::initializer_list<T> cont, const index i)
{
Expects(i >= 0 && i < narrow_cast<index>(cont.size()));