[PATCH] D67135: [clang-tidy] performance-inefficient-vector-operation: Support proto repeated field

Haojian Wu via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Sep 6 06:48:51 PDT 2019


hokein added a comment.

your patch doesn't have a full context, please upload the patch with full context (`=U99999`) or use Arcanist <https://llvm.org/docs/Phabricator.html#requesting-a-review-via-the-command-line>.

> I'd think the check instead should be parametrized, so this patch should become just extending the config.

The AST for protobuf is quite different compared with normal vector, so I don't think there will be an easy and simple way to do it in a config way.



================
Comment at: clang-tools-extra/clang-tidy/performance/InefficientVectorOperationCheck.cpp:86
                 utils::options::serializeStringList(VectorLikeClasses));
+  Options.store(Opts, "EnableProto", static_cast<int64_t>(EnableProto));
 }
----------------
nit: remove `static_cast`?


================
Comment at: clang-tools-extra/clang-tidy/performance/InefficientVectorOperationCheck.cpp:227
+    std::string MutableFieldName =
+        ("mutable_" + ProtoAddFieldCall->getMethodDecl()->getName().substr(4))
+            .str();
----------------
nit: getName().drop_front(sizeof("add_")).


================
Comment at: clang-tools-extra/clang-tidy/performance/InefficientVectorOperationCheck.cpp:233
+      if (Matches.empty()) {
+        // There is no method with name "mutable_xxx".
+        return;
----------------
for repeated fields, there should be `add_foo`, `mutable_foo` methods in the proto generated code (https://developers.google.com/protocol-buffers/docs/reference/cpp-generated#repeatednumeric).

So I think we can remove this check here.


================
Comment at: clang-tools-extra/clang-tidy/performance/InefficientVectorOperationCheck.cpp:249
+            match.getNodeAs<CXXMemberCallExpr>("maybe_reallocation");
+        // Skip cases where "mutable_xxx" or "add_xxx" is called before the
+        // loop.
----------------
the heuristic is limited, and will fail the cases like below:

```
MyProto proto;
set_proto_xxx_size(&proto);
for (int i = 0; i < n; ++i) {
   proto.add_xxx(i);
}
```

In the vector case, we do a more strict check, maybe we do the same way as well (but it will make the check fail to spot some cases)...


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D67135/new/

https://reviews.llvm.org/D67135





More information about the cfe-commits mailing list