ziqingluo-90 added inline comments.

================
Comment at: clang/include/clang/Analysis/Analyses/UnsafeBufferUsage.h:25
+
+class VariableGroupsManager {
+public:
----------------
Use the `VariableGroupsManager` class as an interface to clients.  It hides the 
details about how groups are implemented (which may involve several 
containers). 


================
Comment at: clang/lib/Analysis/UnsafeBufferUsage.cpp:1143
+           // order is deterministic:
+           CompareNode<VarDecl>>
+      byVar;
----------------
To make the order of variables in every group deterministic.


================
Comment at: clang/lib/Analysis/UnsafeBufferUsage.cpp:2179
+      if (FixItsForVariable.count(GrpMate))
+        FinalFixItsForVariable[Var].insert(FinalFixItsForVariable[Var].end(),
+                                           FixItsForVariable[GrpMate].begin(),
----------------
Instead of calling `fixVariable` to generate fix-its for group mates, directly 
copying those fix-its from the `FixItsForVariable` container.

At this point,  `FixItsForVariable` is complete. That is, it maps every 
variable to its own fix-its (excluding fix-its of group mates).


================
Comment at: clang/lib/Analysis/UnsafeBufferUsage.cpp:2198
+//  Manages variable groups:
+class VariableGroupsManagerImpl : public VariableGroupsManager {
+  const std::vector<VarGrpTy> Groups;
----------------
An implementation of `VariableGroupsManager`:  keep a unique copy of each group 
in `Groups` and use their indexes for access.

Note that `getGroupOfVar` assumes that `Var` must in the map.  This is 
guaranteed by the changed made in [[ https://reviews.llvm.org/D155524  | 
D155524 ]]---only "Fixables" associated to variables in the final graph(es) 
will stay and be fixed.    The key set of the `VarGrpMap` is the set of 
variables in the final graph(es).   Therefore, after the graph(es) are computed 
and "Fixables" are pruned,  `VarGrpMap` is the variable domain that we will 
deal with.


================
Comment at: clang/lib/Analysis/UnsafeBufferUsage.cpp:2309
   // Fixpoint iteration for pointer assignments
-  using DepMapTy = DenseMap<const VarDecl *, std::set<const VarDecl *>>;
+  using DepMapTy = DenseMap<const VarDecl *, llvm::SetVector<const VarDecl *>>;
   DepMapTy DependenciesMap{};
----------------
Use `SetVector` to make order deterministic.


================
Comment at: clang/lib/Analysis/UnsafeBufferUsage.cpp:2369
-      for (const VarDecl * V : VarGroup) {
-        if (UnsafeOps.byVar.find(V) != UnsafeOps.byVar.end()) {
-          VariableGroupsMap[V] = VarGroup;
----------------
I removed this guard so that `VarGrpMap` is complete---it has an entry for 
every variable that we need to deal with later.


================
Comment at: clang/lib/Analysis/UnsafeBufferUsage.cpp:2394
+      for (const VarDecl *V : VarGroup) {
+        VarGrpMap[V] = GrpIdx;
       }
----------------
Mapping variables to group indexes instead of groups themselves to avoid copies.


================
Comment at: clang/lib/Sema/AnalysisBasedWarnings.cpp:2168
+  // itself:
+  std::string listVariableGroupAsString(
+      const VarDecl *VD, const ArrayRef<const VarDecl *> &VarGroupForVD) const 
{
----------------
Factor this procedure out to a method for easy re-use later.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D156474

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to