diff options
author | Anna Gringauze <annagrin@microsoft.com> | 2018-08-12 21:44:17 -0700 |
---|---|---|
committer | Neil MacIntosh <neilmac@fb.com> | 2018-08-12 21:44:17 -0700 |
commit | cea0d0ac2bd775f0fb4c7e357a089979370ae3cd (patch) | |
tree | faa0e678f606971b55ef795d507d613d40e93de2 /include/gsl/gsl_util | |
parent | 6a75903c79ff7109c24d281372005b622a9d9177 (diff) | |
download | platform_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_util | 40 |
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())); |