From: Yedidya Feldblum Date: Fri, 3 Nov 2017 23:53:23 +0000 (-0700) Subject: Move folly/SafeAssert.h X-Git-Tag: v2017.11.06.00~3 X-Git-Url: http://plrg.eecs.uci.edu/git/?p=folly.git;a=commitdiff_plain;h=2e1b273c3ea45d6a7ca78d5d927f202f3aeb9b87 Move folly/SafeAssert.h Summary: [Folly] Move `folly/SafeAssert.h` to `folly/lang/`. Reviewed By: Orvid Differential Revision: D6230421 fbshipit-source-id: 0086cd6fedd4ce0e7a4d5302a41153ec1a502e74 --- diff --git a/folly/Makefile.am b/folly/Makefile.am index 79bcecb0..e1c0e464 100644 --- a/folly/Makefile.am +++ b/folly/Makefile.am @@ -314,6 +314,7 @@ nobase_follyinclude_HEADERS = \ json.h \ lang/Assume.h \ lang/Launder.h \ + lang/SafeAssert.h \ Lazy.h \ LifoSem.h \ Likely.h \ @@ -392,7 +393,6 @@ nobase_follyinclude_HEADERS = \ Range.h \ Replaceable.h \ RWSpinLock.h \ - SafeAssert.h \ ScopeGuard.h \ SharedMutex.h \ Singleton.h \ @@ -567,6 +567,7 @@ libfolly_la_SOURCES = \ io/async/ssl/SSLErrors.cpp \ json.cpp \ lang/Assume.cpp \ + lang/SafeAssert.cpp \ detail/MemoryIdler.cpp \ detail/SocketFastOpen.cpp \ MacAddress.cpp \ @@ -592,7 +593,6 @@ libfolly_la_SOURCES = \ portability/Time.cpp \ portability/Unistd.cpp \ Random.cpp \ - SafeAssert.cpp \ ScopeGuard.cpp \ SharedMutex.cpp \ MicroLock.cpp \ diff --git a/folly/SafeAssert.cpp b/folly/SafeAssert.cpp deleted file mode 100644 index 62f3bc44..00000000 --- a/folly/SafeAssert.cpp +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright 2017 Facebook, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include - -#include -#include - -namespace folly { namespace detail { - -namespace { -void writeStderr(const char* s, size_t len) { - writeFull(STDERR_FILENO, s, len); -} -void writeStderr(const char* s) { - writeStderr(s, strlen(s)); -} -} // namespace - -void assertionFailure(const char* expr, const char* msg, const char* file, - unsigned int line, const char* function) { - writeStderr("\n\nAssertion failure: "); - writeStderr(expr + 1, strlen(expr) - 2); - writeStderr("\nMessage: "); - writeStderr(msg); - writeStderr("\nFile: "); - writeStderr(file); - writeStderr("\nLine: "); - char buf[20]; - uint32_t n = uint64ToBufferUnsafe(line, buf); - writeFull(STDERR_FILENO, buf, n); - writeStderr("\nFunction: "); - writeStderr(function); - writeStderr("\n"); - fsyncNoInt(STDERR_FILENO); - abort(); -} - -} // namespace detail -} // namespace folly diff --git a/folly/SafeAssert.h b/folly/SafeAssert.h deleted file mode 100644 index 182b1580..00000000 --- a/folly/SafeAssert.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2017 Facebook, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#pragma once - -#include -#include - -/** - * Verify that the expression is true. If not, prints an error message - * (containing msg) to stderr and abort()s. Just like CHECK(), but only - * logs to stderr and only does async-signal-safe calls. - */ -#define FOLLY_SAFE_CHECK_IMPL(expr, expr_s, msg) \ - ((expr) ? static_cast(0) : \ - ::folly::detail::assertionFailure( \ - FB_STRINGIZE(expr_s), (msg), __FILE__, __LINE__, __PRETTY_FUNCTION__)) -#define FOLLY_SAFE_CHECK(expr, msg) FOLLY_SAFE_CHECK_IMPL((expr), (expr), (msg)) - -/** - * In debug mode, verify that the expression is true. Otherwise, do nothing - * (do not even evaluate expr). Just like DCHECK(), but only logs to stderr and - * only does async-signal-safe calls. - */ -#define FOLLY_SAFE_DCHECK(expr, msg) \ - FOLLY_SAFE_CHECK_IMPL(!folly::kIsDebug || (expr), (expr), (msg)) - -namespace folly { namespace detail { - -[[noreturn]] void assertionFailure( - const char* expr, - const char* msg, - const char* file, - unsigned int line, - const char* function); -} // namespace detail -} // namespace folly diff --git a/folly/experimental/StampedPtr.h b/folly/experimental/StampedPtr.h index 27432fdc..d8d2f65c 100644 --- a/folly/experimental/StampedPtr.h +++ b/folly/experimental/StampedPtr.h @@ -16,7 +16,7 @@ #pragma once -#include +#include #include diff --git a/folly/experimental/symbolizer/Elf.h b/folly/experimental/symbolizer/Elf.h index 2bf37a9d..c097be69 100644 --- a/folly/experimental/symbolizer/Elf.h +++ b/folly/experimental/symbolizer/Elf.h @@ -29,7 +29,7 @@ #include #include #include -#include +#include namespace folly { namespace symbolizer { diff --git a/folly/lang/SafeAssert.cpp b/folly/lang/SafeAssert.cpp new file mode 100644 index 00000000..20e35aee --- /dev/null +++ b/folly/lang/SafeAssert.cpp @@ -0,0 +1,53 @@ +/* + * Copyright 2017 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include +#include + +namespace folly { namespace detail { + +namespace { +void writeStderr(const char* s, size_t len) { + writeFull(STDERR_FILENO, s, len); +} +void writeStderr(const char* s) { + writeStderr(s, strlen(s)); +} +} // namespace + +void assertionFailure(const char* expr, const char* msg, const char* file, + unsigned int line, const char* function) { + writeStderr("\n\nAssertion failure: "); + writeStderr(expr + 1, strlen(expr) - 2); + writeStderr("\nMessage: "); + writeStderr(msg); + writeStderr("\nFile: "); + writeStderr(file); + writeStderr("\nLine: "); + char buf[20]; + uint32_t n = uint64ToBufferUnsafe(line, buf); + writeFull(STDERR_FILENO, buf, n); + writeStderr("\nFunction: "); + writeStderr(function); + writeStderr("\n"); + fsyncNoInt(STDERR_FILENO); + abort(); +} + +} // namespace detail +} // namespace folly diff --git a/folly/lang/SafeAssert.h b/folly/lang/SafeAssert.h new file mode 100644 index 00000000..182b1580 --- /dev/null +++ b/folly/lang/SafeAssert.h @@ -0,0 +1,50 @@ +/* + * Copyright 2017 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include +#include + +/** + * Verify that the expression is true. If not, prints an error message + * (containing msg) to stderr and abort()s. Just like CHECK(), but only + * logs to stderr and only does async-signal-safe calls. + */ +#define FOLLY_SAFE_CHECK_IMPL(expr, expr_s, msg) \ + ((expr) ? static_cast(0) : \ + ::folly::detail::assertionFailure( \ + FB_STRINGIZE(expr_s), (msg), __FILE__, __LINE__, __PRETTY_FUNCTION__)) +#define FOLLY_SAFE_CHECK(expr, msg) FOLLY_SAFE_CHECK_IMPL((expr), (expr), (msg)) + +/** + * In debug mode, verify that the expression is true. Otherwise, do nothing + * (do not even evaluate expr). Just like DCHECK(), but only logs to stderr and + * only does async-signal-safe calls. + */ +#define FOLLY_SAFE_DCHECK(expr, msg) \ + FOLLY_SAFE_CHECK_IMPL(!folly::kIsDebug || (expr), (expr), (msg)) + +namespace folly { namespace detail { + +[[noreturn]] void assertionFailure( + const char* expr, + const char* msg, + const char* file, + unsigned int line, + const char* function); +} // namespace detail +} // namespace folly diff --git a/folly/lang/test/SafeAssertTest.cpp b/folly/lang/test/SafeAssertTest.cpp new file mode 100644 index 00000000..fc2ba6a7 --- /dev/null +++ b/folly/lang/test/SafeAssertTest.cpp @@ -0,0 +1,38 @@ +/* + * Copyright 2017 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#include + +#include +#include + +using namespace folly; + +[[noreturn]] void fail() { + FOLLY_SAFE_CHECK(0 + 0, "hello"); +} + +void succeed() { + FOLLY_SAFE_CHECK(1, "world"); +} + +TEST(SafeAssert, AssertionFailure) { + succeed(); + EXPECT_DEATH(fail(), "Assertion failure: 0 \\+ 0"); + EXPECT_DEATH(fail(), "Message: hello"); +} diff --git a/folly/test/SafeAssertTest.cpp b/folly/test/SafeAssertTest.cpp deleted file mode 100644 index 8df2b8ca..00000000 --- a/folly/test/SafeAssertTest.cpp +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2017 Facebook, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include - -#include - -#include -#include - -using namespace folly; - -[[noreturn]] void fail() { - FOLLY_SAFE_CHECK(0 + 0, "hello"); -} - -void succeed() { - FOLLY_SAFE_CHECK(1, "world"); -} - -TEST(SafeAssert, AssertionFailure) { - succeed(); - EXPECT_DEATH(fail(), "Assertion failure: 0 \\+ 0"); - EXPECT_DEATH(fail(), "Message: hello"); -}