diff --git a/base/Android.bp b/base/Android.bp index fc8dff1fa..12de3b22c 100644 --- a/base/Android.bp +++ b/base/Android.bp @@ -207,6 +207,23 @@ cc_test { test_suites: ["device-tests"], } +cc_test { + name: "libbase_tidy_test", + defaults: ["libbase_cflags_defaults"], + host_supported: true, + + tidy: true, + tidy_checks_as_errors: ["bugprone-use-after-move"], + + srcs: [ + "tidy/unique_fd_test.cpp", + "tidy/unique_fd_test2.cpp", + ], + + shared_libs: ["libbase"], + test_suites: ["device_tests"], +} + cc_benchmark { name: "libbase_benchmark", defaults: ["libbase_cflags_defaults"], diff --git a/base/include/android-base/unique_fd.h b/base/include/android-base/unique_fd.h index c4a0aad0f..9ceb5dbdc 100644 --- a/base/include/android-base/unique_fd.h +++ b/base/include/android-base/unique_fd.h @@ -102,7 +102,7 @@ class unique_fd_impl final { return *this; } - void reset(int new_value = -1) { reset(new_value, nullptr); } + [[clang::reinitializes]] void reset(int new_value = -1) { reset(new_value, nullptr); } int get() const { return fd_; } diff --git a/base/tidy/unique_fd_test.cpp b/base/tidy/unique_fd_test.cpp new file mode 100644 index 000000000..b3a99fcbb --- /dev/null +++ b/base/tidy/unique_fd_test.cpp @@ -0,0 +1,32 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * 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 "android-base/unique_fd.h" + +#include + +#include + +extern void consume_unique_fd(android::base::unique_fd fd); + +TEST(unique_fd, bugprone_use_after_move) { + // Compile time test for clang-tidy's bugprone-use-after-move check. + android::base::unique_fd ufd(open("/dev/null", O_RDONLY | O_CLOEXEC)); + consume_unique_fd(std::move(ufd)); + ufd.reset(open("/dev/null", O_RDONLY | O_CLOEXEC)); + ufd.get(); + consume_unique_fd(std::move(ufd)); +} diff --git a/base/tidy/unique_fd_test2.cpp b/base/tidy/unique_fd_test2.cpp new file mode 100644 index 000000000..b0c71e239 --- /dev/null +++ b/base/tidy/unique_fd_test2.cpp @@ -0,0 +1,19 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * 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 "android-base/unique_fd.h" + +void consume_unique_fd(android::base::unique_fd) {}